2011-08-04 86 views
1

我正在试验不显眼的客户端验证,并一直在努力让它在我的方案中工作。MVC3客户端验证使用ViewModels

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

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

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

,因为我需要输入控制有一个名称=“名称”,而不是“Person.Name” 我可以用

@Html.TextBox("Name", m.Person.Name) 
更正此

但是,最终的输入控件缺少客户端验证需要的数据属性。 有没有办法让客户验证工作,保持我的viewmodel,并使我的控​​制器行动一起工作?

在一个侧面说明,好像在表单字段数据 - *属性只加了,如果你使用

@using (Html.BeginForm()) 

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

是否需要使用表单助手?

+0

您是否尝试过使用TextBoxFor超载与htmlAttributes?就像调用类似于:@ Html.TextBoxFor(m => m.Person.Name,new {name =“Name”)? –

+0

我希望工作。它允许我添加新的属性,但不覆盖name属性。我认为这种行为应该改变,所以你可以这样做。 –

回答

1

以及在你列出的情况下,你的属性的名称将人作为前缀像

<input type='text' name='Person.Name'..../> 
<input type='text' name='Person.Age'.../> 

那里名字和年龄分别是人对象的属性。你可以写你喜欢张贴

[HttpPost] 

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

这里美中不足的是,如果你在你的表单元素收到前缀的名字对象模型绑定器就能填充它的操作方法。如果它不起作用(它对我有效),则可以使用Bind(Prefix="")属性绑定您在后操作方法中的对象。对于绑定的使用例子看看How to use Bind Prefix?

+0

我明白了。是的,确实有用,非常感谢! –

0

你必须来装点视图模型属性要与一个[Required]注释这样的验证......

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