JBe*_*ton 7 validation jquery unobtrusive-validation asp.net-mvc-3 drop-down-menu
我有一个简单的下拉列表,列表中的第一项有一个空值.如果我没有在列表中选择任何内容,则客户端验证会忽略它.我使用注释属性在模型上根据需要设置了该字段.
@Html.DropDownListFor(model => Model.CCPayment.State, UnitedStatesStates.StateSelectList)
[Required(ErrorMessage = "State is Required.")]
public string State
{
get
{
return _state;
}
set
{
_state = value;
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我错过了什么吗?
它看起来像一个合法的错误,这是我在搜索中找到的最佳解决方法:
http://forums.asp.net/t/1649193.aspx
简而言之.您DropDownListFor在自定义Html扩展中包装问题的来源,并手动检索不显眼的客户端验证规则,如下所示:
IDictionary<string, object> validationAttributes = htmlHelper.
GetUnobtrusiveValidationAttributes(
ExpressionHelper.GetExpressionText(expression),
metadata
);
Run Code Online (Sandbox Code Playgroud)
然后,将validationAttributes字典与传递到自定义助手中的任何其他html属性组合,然后将其传递给DropDownListFor
我正在使用的完整代码(我也有一个标签,你可以随意分离):
public static IHtmlString DropDownListWithLabelFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string label, IEnumerable<SelectListItem> items, string blankOption, object htmlAttributes = null)
{
var l = new TagBuilder("label");
var br = new TagBuilder("br");
var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
var mergedAttributes = helper.GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata);
if (htmlAttributes != null)
{
foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(htmlAttributes))
{
object value = descriptor.GetValue(htmlAttributes);
mergedAttributes.Add(descriptor.Name, value);
}
}
l.InnerHtml = label + br.ToString(TagRenderMode.SelfClosing) + helper.DropDownListFor(expression, items, blankOption, mergedAttributes);
return MvcHtmlString.Create(l.ToString(TagRenderMode.Normal));
}
Run Code Online (Sandbox Code Playgroud)
您提供的信息太少,我们无法查明问题。您可能忘记在视图中包含适当的不引人注目的验证脚本,但谁知道呢?你还没有表明你的观点。
这是一个完整的工作示例:
模型:
public class MyViewModel
{
[Required(ErrorMessage = "State is Required.")]
public string State { get; set; }
public IEnumerable<SelectListItem> States
{
get
{
return Enumerable.Range(1, 5).Select(x => new SelectListItem
{
Value = x.ToString(),
Text = "state " + x
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
Run Code Online (Sandbox Code Playgroud)
看法:
@model AppName.Models.MyViewModel
@{
ViewBag.Title = "Home Page";
}
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.LabelFor(x => x.State)
@Html.DropDownListFor(
x => x.State,
new SelectList(Model.States, "Value", "Text"),
"-- Please select a state --"
)
@Html.ValidationMessageFor(x => x.State)
<input type="submit" value="OK" />
}
Run Code Online (Sandbox Code Playgroud)
请注意我们如何在助手中提供默认值DropDownListFor作为最后一个参数。这将在开头插入一个带有空值和自定义文本的选项,如果用户没有选择某些状态,则所需的验证器应该启动。
| 归档时间: |
|
| 查看次数: |
9451 次 |
| 最近记录: |