2011-05-30 63 views
1

我有,我希望用户把它的电话号码的形式。然而,形式看起来像这样:地图超过1表单域模型属性

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

谢谢!

回答

1

我会去,在这种情况下,自定义视图模型。

2

您可以使用自定义的模型绑定来实现这一目标。

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

你可以更容易从默认的模型绑定继承,那么就手动处理自己的更复杂的领域。

对使用​​自定义模型绑定工作一看这多一点信息:Custom Model Binder

编辑:您也可以只接受一种类型的FormCollection在你的行动来读取原始发布的数据,并将其过程在那里,如果你不想用自定义模型绑定来完成整个过程,但这取决于你想在未来如何扩展你的模型。

2

更简单的解决方案可以是使用一些JavaScript在表单上的三个独立的值保存到一个隐藏的输入和单个输入结合到模型中。

+0

漂亮聪明的主意。谢谢! – SaltProgrammer 2011-05-31 03:35:12

+0

您也可以使用一个输入掩码。 http://digitalbush.com/projects/masked-input-plugin/ – Ryan 2011-05-31 03:51:43

0

另一种解决方案也可能是刚刚建立的行动方法的电话号码值的东西,如:

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

}