Return JsonResult 中的 PartialView

Return PartialView in JsonResult

我考虑从 .net core mvc 迁移到 razor pages 所以我正在构建演示应用程序,我在其中尝试 mvc 的功能当我尝试使用局部视图根据 ajax 请求重新加载页面的某些部分时,我曾经使用过并且有点卡住了。有时局部视图非常简单,如下例所示,有时非常复杂(它可以包含额外的嵌套局部视图和表单等,令人惊讶的是它运行良好)。

我的 CustomersModel : PageModel 处理程序看起来像

public JsonResult OnGetCustomerDetailPartialView(int id)
{
    PopulateCustomers();

    var model = new PartialViews.CustomerDetailViewModel()
    {
        Customer = Customers.Where(x => x.Id == id).FirstOrDefault()
    };

    var partialView = PartialViewHelper.PartialView("/PartialViews/CustomerDetailViewModel.cs", model, ViewData, TempData);

    return new JsonResult(new { success = true, html = partialView.ToStringExtension() });
}

局部视图助手

public static class PartialViewHelper
    {
        public static PartialViewResult PartialView(string viewName, object model,
            ViewDataDictionary viewData, ITempDataDictionary tempData)
        {
            viewData.Model = model; <-- this line throws error

            return new PartialViewResult()
            {
                ViewName = viewName,
                ViewData = viewData,
                TempData = tempData
            };
        }
    }

这里的问题是我遇到了一个错误

System.InvalidOperationException: 'The model item passed into the ViewDataDictionary is of type 'RazorPages.PartialViews.CustomerDetailViewModel', but this ViewDataDictionary instance requires a model item of type 'RazorPages.Pages.CustomersModel'.'

所以 ViewData 绑定到 CustomerModel,可以 return 部分视图特定的 ViewModel?

底线问题是,我应该将 Razor Pages 用作 MVC 的替代品,还是它们适用于比 MVC 更简单的项目?

针对该技术问题,请尝试您的此版本方法:

public static class PartialViewHelper
{
    public static PartialViewResult PartialView<T>(string viewName, object model, ViewDataDictionary viewData, ITempDataDictionary tempData)
    {
        return new PartialViewResult()
        {
            ViewName = viewName,
            ViewData = new ViewDataDictionary<T>(viewData, model),
            TempData = tempData
        };
    }
}

然后调用如下(虽然局部视图的name我觉得不太对):

var partialView = PartialViewHelper.PartialView<PartialViews.CustomerDetailViewModel>("/PartialViews/CustomerDetailViewModel.cs", model, ViewData, TempData);

在回答底线问题时,Razor Pages 建立在 MVC 之上。您可以使用 MVC 执行的任何操作,也可以使用 Razor Pages 执行。它旨在取代 MVC 用于服务器端生成 HTML。您可以根据需要构建尽可能复杂的应用程序。但是您的代码可能会比等效的 MVC 应用程序简单很多,这是一件好事,对吗?