【问题标题】:Map More Than 1 Form Field to a Model Property将多个表单字段映射到模型属性
【发布时间】:2011-06-01 05:38:17
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: c# asp.net-mvc razor


    【解决方案1】:

    您可以使用自定义模型绑定器来实现此目的。

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

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

    查看此内容以获取有关使用自定义模型绑定的更多信息:Custom Model Binder

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        另一种解决方案也可能是在 Action 方法中构建电话号码值,例如:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多