使用ViewModels进行MVC3客户端验证

时间:2011-08-04 18:42:21

标签: jquery asp.net-mvc

我正在尝试不引人注目的客户端验证,并且一直在努力让它在我的场景中运行。

我的主要问题是我的视图有一个强类型的ViewModel。这个ViewModel包含几个用于填充下拉列表的集合,并有一个额外的属性(让我们称之为Person),这是我希望表单编辑的实际对象。

处理帖子的我的控制器操作期望获得Person对象而不是发布的整个ViewModel。所以我一直无法使用:

@Html.TextBoxFor(m => m.Person.Name)

因为我需要输入控件的名称=“Name”而不是“Person.Name” 我可以使用

来纠正这个问题
@Html.TextBox("Name", m.Person.Name)

但是结果输入控件缺少data- *属性客户端验证需求。 有没有办法让客户端验证工作,保持我的viewmodel,并让我的控制器操作一起工作?

侧面说明,如果您使用

,表单字段上的data- *属性似乎只会被添加
@using (Html.BeginForm())

用手写出我自己的<form>标签似乎打破了它。

是否需要使用表单助手?

2 个答案:

答案 0 :(得分:1)

在你概述的场景中,你的属性名称将以像

这样的人为前缀
<input type='text' name='Person.Name'..../>
<input type='text' name='Person.Age'.../>

其中Name和Age分别是Person对象的属性。你可以写你的后期行动方法

[HttpPost]

    public ActionResult Index(Person Person)
    {
       //handle person here
    }

这里的问题是,如果您在表单元素中接收名称为Prefix的对象,则modelbinder将能够填充它。如果它不起作用(它确实对我有效),你可以在post action方法中绑定对象时使用Bind(Prefix="")属性。例如,使用bind可以查看How to use Bind Prefix?

答案 1 :(得分:0)

您必须使用[Required]注释来装饰要验证的ViewModel属性,如此...

using System.ComponentModel.DataAnnotations;
.....
public class MyViewModel
{
    .....
    [Required]
    public string Name { get; set; }
    .....
}