我考虑从 .net核心mvc 迁移到剃刀页面,因此我正在构建演示应用程序,在此我尝试使用我使用的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:'将模型项传递到 ViewDataDictionary是类型 'RazorPages.PartialViews.CustomerDetailViewModel',但这 ViewDataDictionary实例需要以下类型的模型项 'RazorPages.Pages.CustomersModel'。
因此,将ViewData绑定到CustomerModel,可以返回特定于部分视图的ViewModel吗?
最重要的问题是,我应该使用Razor Pages代替MVC,还是将其用于比MVC复杂的项目?
答案 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应用程序简单得多,这是一件好事,对吧?