MVC主页上出现重复规则

时间:2014-03-17 05:30:02

标签: c# asp.net-mvc validation

我一直关注Visual Studio Magazine上的一篇文章,并且发现由于某种原因,我在我的页面下拉列表中获得了规则的重复项。有人可以解释我在这里缺少的东西吗?另外我想知道如何解决这个问题。

经过仔细检查后,我认为问题在于验证器线,因为它似乎是在读取4个对象而不是2个(电话验证器和电子邮件验证器)。电子邮件验证程序代码与电话基本相同,但使用不同的正则表达式。

控制器代码:

[ImportMany]
public IEnumerable<Lazy<BusinessRules.IValidate<string>, BusinessRules.IValidateMetaData>> Validators { get; private set; }

[HttpGet]
public ActionResult Index()
{
    var vm = new ValidationFormModel();
    vm.Rules = new List<SelectListItem>(from v in Validators
                                        select new SelectListItem() 
                                        { Text = v.Metadata.Name, 
                                            Value = v.Metadata.Name });

    return View(vm);
}

查看型号代码:

public class ValidationFormModel
{
    public string Input { get; set; }
    public List<SelectListItem> Rules { get; set; }
    public string Rule { get; set; }
    public string StatusLabel { get; set; }
}

业务规则代码

[Export(typeof(IValidate<string>))]
[ExportMetadata("Name", "Phone")]
public class ValidatePhone : IValidate<string>
{
    const string PHONE_PATTERN = @"^((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}$";

    public ValidationResult Validate(string input)
    {
        var result = new ValidationResult();

        if (input == null || !Regex.IsMatch(input, PHONE_PATTERN))
        {
            result.ErrorMessage = string.Format("{0} is not a valid phone number");
        }
        else
        {
            result.IsValid = true;
        }

        return result;
    }
}

观点:

@model ValidationExample.ViewModels.ValidationFormModel


@{
    ViewBag.Title = "MEF Demo";
}

@using (Html.BeginForm())
{
    <strong>@Html.DisplayFor(m => m.StatusLabel)</strong>
    @Html.ValidationSummary(false)
    <fieldset>
        <legend>Validation Demo</legend>
        @Html.LabelFor(m => m.Input)
        @Html.TextBoxFor(m => m.Input)
        @Html.LabelFor(m => m.Rule)
        @Html.DropDownListFor(m => m.Rule, Model.Rules)
    </fieldset>
    <input type="submit" />

}

1 个答案:

答案 0 :(得分:1)

从视图中,尝试使用IEnumerable

@model IEnumerable<ValidationExample.ViewModels.ValidationFormModel>

并尝试将下拉列表更改为正常<select>

<fieldset> <legend>Validation Demo</legend> @Html.LabelFor(m => m.Input) @Html.TextBoxFor(m => m.Input) @Html.LabelFor(m => m.Rule)

    foreach(var item in Model)
    {
        <select>@item.Rule </select>
    }
</fieldset>