Return razor 页面处理程序的部分视图
Return a partial view from a razor page Handler
我遇到问题return从 razor 页面查看局部视图,我的情况是
我有一个局部视图,它是一个表单并且有一个模型。我有 3 个表格驻留在单个剃刀页面上
Form A post 一个 ModelA
表格 B post 模型 B
我的问题是,我想在作为剃刀页面的父页面上处理他们特定的 post 事件。
我如何 return 这个局部视图
OnPostModelA(ModelA model)
{
if(! ModelState.IsValid)
return Partialview("_CreateModelA", model);
}
使用 razor pages 这可能吗?还是不可能?
我只想 return 使用 ajax 指定模型的部分视图。
如您所知,Razor Pages 在 PageModel
上没有等效的 PartialView
方法。如果您确实想在 PageModel
方法中调用不同的局部视图,只需在 PageModel
:
中添加一个 PartialView
辅助方法
[NonAction]
public virtual PartialViewResult PartialView(string viewName, object model)
{
ViewData.Model = model;
return new PartialViewResult()
{
ViewName = viewName,
ViewData = ViewData,
TempData = TempData
};
}
这里我用一个ViewData.Model
来存储你的模型对象,假设你的模型类型命名为X1Model
:
您可以在部分视图中使用它。
创建一个简单的局部视图,命名为 _CreateModelA.cshtml
:
@model HelloModel
AAAAA
<div>
@Model.Model.Welcome
</div>
和另一个名为 _CreateModelB.cshtml
的局部视图:
@model HelloModel
BBBBBBBB
<div>
@Model.Model.Welcome
</div>
最后,您可以 return PartialView
在您的 PageModel 中:
public class HelloModel : PageModel
{
public X1Model Model { get; set; }
public ActionResult OnGet(int rand = 0)
{
var flag = rand % 2 == 0 ? true : false;
var model = new HelloModel() {
Model = new X1Model {
Welcome = "Hello,world",
}
};
if (flag)
{
return PartialView("_CreateModelA", model);
}
else
{
return PartialView("_CreateModelB", model);
}
}
[NonAction]
public virtual PartialViewResult PartialView(string viewName, object model)
{
// ...
}
}
这是截图:
- 但是,不建议将部分视图逻辑放在 PageModel 中。如下在页面文件中使用它会更好:
@if(){
<partial name="" />
}else{
<partial name="" />
}
在 asp dotnet core 2.2 中,Microsoft 向 PageModel class 添加了一个 Partial 方法,其工作方式类似于 Controller class 上的 PartialView 方法。但是,它不允许您将 ViewData 传递给视图。所以,如果您需要这样做,那么您可以像这样创建自己的 PartialViewResult:
var resultViewData = new ViewDataDictionary<YourModelType>(ViewData, model);
resultViewData[YourViewDataProperty] = yourViewDataValue;
return new PartialViewResult
{
ViewName = "_Branch",
ViewData = resultViewData,
TempData = TempData
};
我遇到问题return从 razor 页面查看局部视图,我的情况是
我有一个局部视图,它是一个表单并且有一个模型。我有 3 个表格驻留在单个剃刀页面上 Form A post 一个 ModelA 表格 B post 模型 B 我的问题是,我想在作为剃刀页面的父页面上处理他们特定的 post 事件。 我如何 return 这个局部视图
OnPostModelA(ModelA model)
{
if(! ModelState.IsValid)
return Partialview("_CreateModelA", model);
}
使用 razor pages 这可能吗?还是不可能? 我只想 return 使用 ajax 指定模型的部分视图。
如您所知,Razor Pages 在
中添加一个PageModel
上没有等效的PartialView
方法。如果您确实想在PageModel
方法中调用不同的局部视图,只需在PageModel
:PartialView
辅助方法[NonAction] public virtual PartialViewResult PartialView(string viewName, object model) { ViewData.Model = model; return new PartialViewResult() { ViewName = viewName, ViewData = ViewData, TempData = TempData }; }
这里我用一个ViewData.Model
来存储你的模型对象,假设你的模型类型命名为X1Model
:
您可以在部分视图中使用它。
创建一个简单的局部视图,命名为 _CreateModelA.cshtml
:
@model HelloModel
AAAAA
<div>
@Model.Model.Welcome
</div>
和另一个名为 _CreateModelB.cshtml
的局部视图:
@model HelloModel
BBBBBBBB
<div>
@Model.Model.Welcome
</div>
最后,您可以 return PartialView
在您的 PageModel 中:
public class HelloModel : PageModel
{
public X1Model Model { get; set; }
public ActionResult OnGet(int rand = 0)
{
var flag = rand % 2 == 0 ? true : false;
var model = new HelloModel() {
Model = new X1Model {
Welcome = "Hello,world",
}
};
if (flag)
{
return PartialView("_CreateModelA", model);
}
else
{
return PartialView("_CreateModelB", model);
}
}
[NonAction]
public virtual PartialViewResult PartialView(string viewName, object model)
{
// ...
}
}
这是截图:
- 但是,不建议将部分视图逻辑放在 PageModel 中。如下在页面文件中使用它会更好:
@if(){
<partial name="" />
}else{
<partial name="" />
}
在 asp dotnet core 2.2 中,Microsoft 向 PageModel class 添加了一个 Partial 方法,其工作方式类似于 Controller class 上的 PartialView 方法。但是,它不允许您将 ViewData 传递给视图。所以,如果您需要这样做,那么您可以像这样创建自己的 PartialViewResult:
var resultViewData = new ViewDataDictionary<YourModelType>(ViewData, model);
resultViewData[YourViewDataProperty] = yourViewDataValue;
return new PartialViewResult
{
ViewName = "_Branch",
ViewData = resultViewData,
TempData = TempData
};