假设我有一个使用特定ViewModel的页面(视图):
@model IEnumerable<MyProject.ViewModels.MyViewModel>
在此页面中,我有一个表单,该表单通过另一个ViewModel发布数据(我们称其为PostModel):
@using (Html.BeginForm("Order", "Order", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Give your order info</h4>
<hr />
@Html.ValidationSummary()
<div class="form-group">
<label for="Order.Name" class="col-md-2 control-label">Name:</label>
<div class="col-md-10">
@Html.TextBox("Order.Name", null, new { @class = "form-control" })
@Html.ValidationMessage("Order.Name")
</div>
</div>
...
}
这是在Order HttpPost操作方法中的控制器上处理的,该方法采用了我的PostModel类型的参数.
我可以按照上面的样式显示验证消息.我的问题是,如何(如果可能)为我的PostModel设置强类型?就像是:
@Html.TextBox<MyPostModel>(t => t.Order.Name, ...)
@Html.ValidationMessageFor<MyPostModel>(t => t.Order.Name)
这完全有可能,而无需更改页面的ViewModel?
解决方法:
您可以简单地为该表单使用不同的局部视图,并在该局部视图中将其指定为所需的任何类型,在这种情况下,如我在您的代码示例Order中所见
假设您有一个名为Order的模型,其定义如下
public class Order
{
public string Name { get; set; }
}
还有一个名为_MyPostPartialView.cshtml的局部视图及其定义
@model Order
@using (Html.BeginForm("Order", "Order", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Give your order info</h4>
<hr />
@Html.ValidationSummary()
<div class="form-group">
@Html.Label(m => m.Name, "Name:")
<div class="col-md-10">
@Html.TextBox(m => m.Name, null, new { @class = "form-control" })
@Html.ValidationMessage(m => m.Name)
</div>
</div>
...
}
完成了!