【发布时间】:2013-08-22 14:04:48
【问题描述】:
我有一个需要填写必填字段的日期选择器文本框。 型号:
[Required(AllowEmptyStrings = false, ErrorMessage = "Required")]
[DisplayFormat(ConvertEmptyStringToNull = false)]
[Display(Name = "Date of Something")]
[DatePicker] //custom tag builder I wrote to make this a datepicker
public string DateOfSomething { get; set; }
查看:
@Html.ControlGroupFor(x => x.DateOfSomething) //has the custom tag I built to handle datepicker
@Html.ValidationMessageFor(x => x.DateOfSomething)
jquery:
$("#btnSubmit").click(function() {
if ($('#DateOfSomething') == "" || $('#DateOfSomething') == null) {
$("#ValidationSummary").append("<div>Required</div>");
$("#ValidationSummary").show();
}
});
在_布局中
<script src="@Url.Content("~/Scripts/jquery-1.9.1.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive-custom-for-bootstrap.js")"></script>
ControlGroupFor 扩展:
public static MvcHtmlString ControlGroupFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression)
{
var propertyName = ExpressionHelper.GetExpressionText(expression);
var controlGroupWrapper = BuildTagWith("div", "control-group");
controlGroupWrapper.InnerHtml += htmlHelper.LabelFor(expression, new Dictionary<string, object> { { "class", "control-label" } }).ToHtmlString();
var controlDiv2 = BuildTagWith("div", "controls");
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var inputTag = "";
var valAttributes = htmlHelper.GetUnobtrusiveValidationAttributes(propertyName, metadata);
if (metadata.AdditionalValues.ContainsKey("DatePicker"))
{
CreateDatePicker(htmlHelper, expression, propertyName, controlDiv2, controlGroupWrapper);
controlGroupWrapper.InnerHtml += htmlHelper.ValidationMessageFor(expression, null, valAttributes);
return MvcHtmlString.Create(controlGroupWrapper.ToString(TagRenderMode.Normal));
}
if (metadata.AdditionalValues.ContainsKey("DropDownListPropertyName"))
{
var propertyNameForOptions = metadata.AdditionalValues["DropDownListPropertyName"] as string;
var options = GetPropValue(htmlHelper.ViewData.Model, propertyNameForOptions) as Dictionary<string, string>;
var selectedItem = GetPropValue(htmlHelper.ViewData.Model, propertyName) as string;
inputTag += BuildSelectList(options, propertyName, selectedItem);
}
else
{
var value = GetPropValue(htmlHelper.ViewData.Model, propertyName);
inputTag += htmlHelper.EditorFor(expression).ToHtmlString();
}
controlDiv2.InnerHtml += inputTag + htmlHelper.ValidationMessageFor(expression, null, valAttributes);
controlGroupWrapper.InnerHtml += controlDiv2.ToString(TagRenderMode.Normal);
return MvcHtmlString.Create(controlGroupWrapper.ToString(TagRenderMode.Normal));
}
尽管我的代码试图阻止它,但我还是发布到表单。有什么想法吗?
【问题讨论】:
-
你的
DateOfSomething属性是string而不是DateTime有什么特别的原因吗? -
不是真的,考虑到 MVC 将视图上的所有内容都转换为字符串,我只是稍后将转换回日期时间
-
虽然强类型化你的模型提供了许多优点,即在这种情况下它会给你更严格的验证。当然,视图中的值是“字符串”,但是当它们被回发时,MVC 模型绑定会自动验证并将它们转换为它们的目标类型,这是一个巨大的优势。
-
ControlGroupFor助手有什么作用?您使用它而不是EditorFor的任何特殊原因? -
发布了我的自定义 ControlGroupForCode 的代码
标签: jquery validation asp.net-mvc-4