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

本文关键字:模型 属性 段映射 字段 表单 | 更新日期: 2023-09-27 17:57:56

我有一个表单,希望用户在其中输入它的电话号码。然而,表单看起来是这样的:

  [FormField-1] - [FormField-2] - [FormField-3]

其中有三个文本框,方便用户将其放在xxx-xxxx-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" />
}

我该如何绕过这一点,这样我就不必有三个不同的类属性来匹配代表电话号码的三个不同表单字段了?

谢谢!

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

您可以使用自定义模型绑定器来实现这一点。

基本上,你注册了一个类型(你创建的)来处理一个特定的模型,你可以读取发布的表单字段并手动填充你的模型,而不是让默认的模型绑定器来做这件事。我认为这是你在这种情况下的唯一选择。

您可以通过从默认的模型绑定器继承,然后自己手动处理更复杂的字段来简化它。

看看这个,了解更多关于使用自定义模型绑定的信息:自定义模型绑定

编辑:如果你不想完全使用自定义模型绑定,你也可以在你的操作中接受一种类型的FormCollection来读取原始发布的数据并在其中进行处理,但我想这取决于你将来想如何扩展你的模型。

一个更简单的解决方案可以是在表单上使用一些javascript将三个单独的值保存到一个隐藏输入中,并将该单个输入绑定到模型。

在这种情况下,我会使用自定义ViewModel。

另一个解决方案也可能是在Action方法中使用以下内容构建电话号码值:

[HttpPost]                                                        
public ActionResult FormSubmit(Person person)
{
     person.phone =  Request.Form["FormField-1"] +  Request.Form["FormField-2"] + Request.Form["FormField-3"];
    ...
}