将多于1个表单字段映射到模型属性

时间:2011-05-30 23:58:47

标签: c# asp.net-mvc razor

我有一个表单,我希望用户输入它的电话号码。但是,表单看起来像这样:

  [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个不同表单字段?

谢谢!

4 个答案:

答案 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"];
    ...

}