验证不同于页面ViewModel的ViewModel

本文关键字:ViewModel 不同于 验证 | 更新日期: 2023-09-27 18:10:38

假设我有一个使用特定ViewModel的页面(View):

@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 ?

验证不同于页面ViewModel的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

jquery.validate.min.js
jquery.validate.unobtrusive.min.js

在您的表单视图

@Html.LabelFor(model => model.ClientDocument[0].Number)
 @Html.TextBoxFor(model => model.ClientDocument[0].Number, new { @class = "form-control" })

在控制器

[HttpPost]
public ActionResult Create(YourViewModel model){
if (ModelState.IsValid)//to complete validate server side
}

在你的ViewModel *尝试使用DataAnnotation

 [Display(Name = "Name of Field")]
    [Required(ErrorMessage="your message error")]        
    public string Name { get; set; }
    public DocumentViewModel[] ClientDocument { get; set; }

简单的答案是不要为GET和POST使用不同的视图模型。没有理由这么做。您POST的任何内容都应该通过用于GET请求的视图模型呈现。如果出于某种原因,您要发布一些最初不在用于GET请求的视图模型上的内容,那么坦率地说,停止它。