验证与页面ViewModel不同的ViewModels

假设我有一个使用特定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>
    ...
}

完成了!

上一篇:javascript-防止直接操纵html5输入数字字段


下一篇:php-Laravel-表单验证-数组至少需要1个字段