2011-11-04 67 views
3

我想验证包含在两个字段中的电话号码。MVC3验证多个字段作为单个属性

第一个字段显示区号,另一个字段显示剩余的电话号码数字。

的要求是:

  1. 他们要求两者。
  2. 它们必须是数字。
  3. 区号字段必须最多为6位数字,电话号码字段必须最多为10位数字。

需要为这两个字段显示单条消息。例如,如果地区代码丢失但提供了电话号码,则应在两个字段后面显示一条消息,说明“请输入电话号码”。

我目前拥有的模式是类似于:

public class Customer 
{ 
    //...other fields here 

    public string AreaCode { get; set; } 

    public string PhoneNumber { get; set; } 
} 

我无法实现电话与正则表达式或simlar单场。

也有同样的问题,这个here(还有一种类似于here),其中的答案建议创建一个自定义的验证属性(在这种情况下,一个名为MultiFieldRequired)来指定需要哪些属性中的字段的名称。验证属性然后使用反射来检查其他属性的值,以在出现错误时进行报告。

例如,在上述模型的情况下,我认为我应该有:

public class Customer 
{ 
    //...other fields here 

    public string AreaCode { get; set; } 

    [MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")] 
    public string PhoneNumber { get; set; } 
} 

然而,我所遇到的一个小问题,所提供的解决方案。自定义验证属性返回的错误仅针对具有数据注释的字段(PhoneNumber是上述模型)进行报告。因此,如果用户没有输入AreaCode,但提供了PhoneNumber,则将针对PhoneNumber字段而不是AreaCode报告错误。此外,如果您使用Visual Studio Internet项目提供的css,则提供的PhoneNumber字段将显示为红色,而无效区域代码显示为白色(不显示错误),因此这看起来有点奇怪。

有没有人有办法纠正这种着色行为,或者如果任何一个字段出错(在字段中使用正确的颜色),我可以报告错误消息的方式?

预先感谢您。

回答

3

应用同时在属性和只有一个ValidationMessageFor(任何人),并把它放在你要显示的信息(从看来你只需要一个错误信息后)。

public class Customer 
{ 
    //...other fields here 

    [MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")] 
    public string AreaCode { get; set; } 

    [MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")] 
    public string PhoneNumber { get; set; } 
} 

查看

<div class="editor-label"> 
     @Html.LabelFor(model => model.AreaCode) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.AreaCode) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.PhoneNumber) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.PhoneNumber) 
     @Html.ValidationMessageFor(model => model.PhoneNumber) 
    </div> 
+1

我不太确定这个例子中的实现是如何工作的。唯一可以实现这个功能的方法是在属性之上添加属性,例如'[MultiFieldRequired(new string [3] {“Phone1”,“Phone2”,“Phone3”},ErrorMessage =“Phone#required “)]'------代码只接受一个数组。我不确定人们是如何使用这些逗号分隔的字符串并使其工作。 – ganjeii

+0

我同意,语法不允许编译的东西,ganjeii是正确的 – Gaurav123

1
[MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")] 
public class Customer 
{ 
    //...other fields here 

    public string AreaCode { get; set; } 

    public string PhoneNumber { get; set; } 
} 

Multi字段需要放在类上,而不是单个属性。如果您查看实现,它将查看传入的对象并遍历其属性。

+0

我不太确定这是正确的吗?如果你看看上面的文字,斯科特回答说:“这让我在属性层面而不是模型层面实现这个......”。此外,在我提供的第二个(类似ish)示例中,Darin Dimitrov给出了属性级别(电子邮件属性上方)使用的属性示例。尽管两个答案都重复了这些属性,但我认为该错误旨在以属性级别报告,而不是模型级别。 – Dangerous

+0

@Dangerous Darin的例子比较好,我会进一步研究一下。但我不明白为什么你想在一个属性上影响其他人时将其定义。 –

+0

Thankyou但我不想在模型级别定义验证,因为我想针对属性(或本例中的属性组)报告错误。我希望任何错误消息出现在两个电话号码字段的右侧(或下方)。由于我还会为此模型设置其他电话号码字段,因此使用模型级别验证很难将错误报告给属性。我相信jquery允许您以这种方式为用户验证定义属性组(不要在此引用我),但不能使用mvc3数据注释而不定义自定义数据注释。 – Dangerous