我正在尝试不引人注目的客户端验证,并且一直在努力让它在我的场景中运行。
我的主要问题是我的视图有一个强类型的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>
标签似乎打破了它。
是否需要使用表单助手?
答案 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; }
.....
}