我一直关注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" />
}
答案 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>