C# 合并2个TextBoxFor绑定到一个属性MVC
我需要将联系人号码保存在注册表中,其中有两个文本框,一个用于C# 合并2个TextBoxFor绑定到一个属性MVC,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我需要将联系人号码保存在注册表中,其中有两个文本框,一个用于国家代码,另一个用于号码。现在,我需要将两者结合起来,并绑定到我的类中的单个属性中。我该怎么做 查看: <div class="form-group"> @Html.LabelFor(m => m.Phone, "Contact Number:") @Html.TextBoxFor(m => m.xxxx,new { @class = "form-control", @id = "txt
国家代码
,另一个用于号码
。现在,我需要将两者结合起来,并绑定到我的类中的单个属性中。我该怎么做
查看:
<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>
现在,我应该绑定电话号码字段代码中的属性以连接为一个吗?是否有任何方法,或者我应该声明另一个名为
code
的属性,然后继续?一般来说,您不应该尝试拆分/联接对象。您只是在应用程序中引入了一个潜在的故障点。如果您只关心存储单个组合的电话
,那么让用户直接在电话
的字段中输入他们的电话号码。如果您关心确保每个电话号码都有一个国家/地区代码,那么您可以使用这样的电话号码验证库来解析用户输入的电话号码,并将其存储在数据库中的方式标准化
尝试将两个字段合并为一个字段的问题是,然后必须将一个字段拆分为两个。特别是像国家代码这样长度可变的代码,这将很难可靠地实现。但是,如果您坚持走这条路,我建议您使用如下视图模型:
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; }
然后,您将分别绑定到视图中的
CountryCode
和Number
。Phone
自定义getter和setter将负责在组合部件和组成部件之间来回转换。您可以使用IModelBinder
界面中提供的BindModel()
方法轻松完成此操作
:使用指定的控制器上下文和绑定上下文将模型绑定到一个值
另见
注意:在上述示例中,
名字
、中间名
和姓氏
绑定到全名属性。您可以以相同的方式将所需的两个属性绑定到一个属性。使用具有属性CountryCode
和PhoneNumber
的视图模型,并在POST方法中组合值并将其映射到数据模型Phone
property显示为您的属性分配值的代码model@StephenMuecke我会做的相同的谢谢
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; }