【问题标题】:Return PartialView in JsonResult在 JsonResult 中返回 PartialView
【发布时间】:2019-04-14 16:05:40
【问题描述】:

我考虑从 .net core mvc 迁移到 razor pages,所以我正在构建演示应用程序,在其中尝试使用 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 更简单的项目?

【问题讨论】:

    标签: partial-views razor-pages


    【解决方案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 应用程序简单得多,这是一件好事,对吧?

    【讨论】:

    • 谢谢,您的版本正在运行 :) 但是,我无法运行 ToStringExtension()。我稍后会尝试修复它。现在我可以使用在 SO stackoverflow.com/a/39400153/2333663 上找到的 ViewRenderService 从部分视图中获取 html。所以我会在 Razor Pages 中尝试新项目 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多