我有一个表单,我希望用户输入它的电话号码。但是,表单看起来像这样:
[FormField-1] - [FormField-2] - [FormField-3]
有三个文本框,方便用户将其格式化为xxx-xxx-xxxx。但是,我的模型类是:
class Person
{
[Required(ErrorMessage="Phone Mandatory!")]
public string phone {get; set;}
}
我的观点如下:
@model MvcApplication1.Models.Person
@using ( Html.BeginForm("Create", "Home"))
{
@Html.TextBoxFor( model => model.phone )
@Html.ValidationMessageFor( model => model.phone )<br />
<input type="submit" value="submit" />
}
如何解决这个问题,以便我不必拥有三个不同的类属性来匹配代表电话号码的3个不同表单字段?
谢谢!
答案 0 :(得分:2)
您可以使用自定义模型绑定器来实现此目的。
基本上,您注册了一个类型(您创建的)来处理特定模型,您可以在已发布的表单字段中读取并手动填充模型,而不是使用默认的模型绑定器来执行此操作。在这种情况下,我认为这是你唯一的选择。
您可以通过继承默认的模型绑定器来简化操作,然后自己手动处理更复杂的字段。
有关使用自定义模型绑定的更多信息,请查看此信息:Custom Model Binder
编辑:你也可以在你的行动中接受一种FormCollection来读取原始发布的数据并在那里处理它,如果你不想用自定义模型绑定进行整个过程,但这取决于如何你想在未来扩展你的模型我想。
答案 1 :(得分:2)
更简单的解决方案可能是在表单上使用一些javascript将三个单独的值保存到一个隐藏的输入中,并将该单个输入绑定到模型。
答案 2 :(得分:1)
在这种情况下,我会使用自定义ViewModel。
答案 3 :(得分:0)
另一个解决方案也可能是在Action方法中构建电话号码值,例如:
[HttpPost]
public ActionResult FormSubmit(Person person)
{
person.phone = Request.Form["FormField-1"] + Request.Form["FormField-2"] + Request.Form["FormField-3"];
...
}