与ViewModel页面不同的ViewModel验证

时间:2014-06-26 19:29:54

标签: c# asp.net-mvc validation asp.net-mvc-5

假设我有一个页面(View)需要某个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?

3 个答案:

答案 0 :(得分:3)

您可以简单地为该表单使用不同的局部视图,在该局部视图中,您可以将其指定为您想要的任何类型,在本例中,正如我在您的代码示例中所见,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>
    ...
}

你完成了!

答案 1 :(得分:0)

尝试在视图中导入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; }

答案 2 :(得分:0)

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