将2个TextBoxFor绑定到一个属性MVC

时间:2017-06-06 12:10:36

标签: c# asp.net-mvc razor

我需要在注册表单中保存联系电话,其中我有2个TextBox,一个用于Country Code,另一个用于Number。现在我需要将两者结合起来并绑定到我班上的一个属性中。我怎么能这样做?

查看:

 <div class="form-group">
      @Html.LabelFor(m => m.Phone, "Contact Number:")
      @Html.TextBoxFor(m => m.xxxx,new { @class = "form-control", @id = "txtContactCode", required="required", type ="number" })-
      @Html.TextBoxFor(m => m.Phone,new { @class = "form-control", @id = "txtContactNumber", required="required", type ="number" })
 </div>

属性,

 public string Phone { get; set; }

现在我应该将电话号码字段的代码中的属性绑定为一个连接?有什么办法,或者我应该声明另一个名为Code的属性然后继续?

2 个答案:

答案 0 :(得分:0)

一般情况下,你不应该尝试拆分/加入东西。您只是在应用程序中引入了潜在的失败点。如果您只关心存储单个组合Phone,请让用户直接在Phone字段中输入他们的电话号码。如果您关心确保每个电话号码都有国家/地区代码,您可以使用此port of Google's libphonenumber library之类的电话号码验证库来解析用户输入的电话号码并标准化它们在数据库中的存储方式。

尝试将两个字段合并为一个的问题是,您必须将该字段拆分为两个字段。特别是像国家代码这样长度可变的东西,这将是非常难以可靠的。但是,如果您坚持沿着这条路走下去,我建议您使用以下视图模型:

public string Phone
{
    get { return String.Format("{0} {1}", CountryCode, Number); }
    set
    {
        CountryCode = null;
        Number = null;

        if (value != null)
        {
            var parts = value.Split(new[] { ' ' }, 2);
            if (parts.Length == 2)
            {
                CountryCode = parts[0];
                Number = parts[1];
            } 
        }
    }
}

public string CountryCode { get; set; }
public string Number { get; set; }

然后,您将在视图中分别绑定到CountryCodeNumberPhone自定义getter和setter将负责在组合和组成部分之间来回转换。

答案 1 :(得分:-1)

您可以使用BindModel()界面中提供的IModelBinder方法轻松完成此操作。

  

IModelBinder.BindModel使用指定的控制器上下文和绑定上下文将模型绑定到值。

另见this explanation with real-time example

注意:在上面的示例中,first_namemiddle_namelast_name绑定了全名属性。您可以以相同的方式将所需的两个属性绑定到一个属性。