在JsonResult中返回PartialView

时间:2019-04-14 16:05:40

标签: partial-views razor-pages

我考虑从 .net核心mvc 迁移到剃刀页面,因此我正在构建演示应用程序,在此我尝试使用我使用的mvc的功能,并且在出现问题时有点卡住我正在尝试使用部分视图基于ajax请求重新加载页面的某些部分。有时部分视图非常简单,例如下面的示例,有时又非常复杂(它可以包含带有表单等的其他嵌套部分视图,令人惊讶的是它可以正常工作)。

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

  • 它已返回JsonResult,因为我需要有关错误的反馈
  • 有时我会返回多个不完整的局部视图
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:'将模型项传递到   ViewDataDictionary是类型   'RazorPages.PartialViews.CustomerDetailViewModel',但这   ViewDataDictionary实例需要以下类型的模型项   'RazorPages.Pages.CustomersModel'。

因此,将ViewData绑定到CustomerModel,可以返回特定于部分视图的ViewModel吗?

最重要的问题是,我应该使用Razor Pages代替MVC,还是将其用于比MVC复杂的项目?

1 个答案:

答案 0 :(得分:1)

为解决技术问题,请尝试使用此版本的方法:

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
        };
    }
}

然后按如下方式进行调用(尽管部分视图的名称在我看来不正确):

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

为回答最基本的问题,Razor Pages建立在MVC之上。使用MVC可以做的任何事情,也可以使用Razor Pages进行。它旨在代替MVC来生成服务器端的HTML。您可以使用它来构建复杂的应用程序。但是您的代码可能比等效的MVC应用程序简单得多,这是一件好事,对吧?