提问人:florinszilagyi 提问时间:12/11/2013 最后编辑:Aritra Bflorinszilagyi 更新时间:12/17/2013 访问量:448
MVC4 验证在提交后进行
MVC4 Validation happens after submit
问:
我的 MVC4 应用程序存在一些问题 - 表单验证仅在提交后进行。
我希望在提交之前对表单进行验证。 这是我的观点(部分)
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
Html.EnableClientValidation();
Html.EnableUnobtrusiveJavaScript();
<fieldset>
<legend>Offer</legend>
<div class="editor-label">
@Html.LabelFor(model => model.HotelName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.HotelName)
@Html.ValidationMessageFor(model => model.HotelName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.LocationName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LocationName)
@Html.ValidationMessageFor(model => model.LocationName)
</div>
我在我的web.config中也有
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
这些是我的页面中包含的所有脚本
<script type="text/javascript" length="7" src="/Scripts/jquery/jquery-2.0.3.js?cdv=1">
<script type="text/javascript" length="7" src="/Scripts/jquery/jquery-2.0.3.min.js?cdv=1">
<script type="text/javascript" length="7" src="/Scripts/jquery/jquery.cookies.js?cdv=1">
<script type="text/javascript" length="7" src="/Scripts/language.js?cdv=1">
<script type="text/javascript" src="/Scripts/jqueryval/jquery.validate.js?cdv=1">
<script type="text/javascript" src="/Scripts/jqueryval/jquery.validate.min.js?cdv=1">
<script type="text/javascript" src="/Scripts/jqueryval/jquery.validate.unobtrusive.js?cdv=1">
<script type="text/javascript" src="/Scripts/jqueryval/jquery.validate.unobtrusive.min.js?cdv=1">
<script type="text/javascript" src="/Scripts/jquery-ui/jquery-ui-1.10.3.js?cdv=1">
<script type="text/javascript" src="/Scripts/jquery-ui/jquery-ui-1.10.3.min.js?cdv=1">
<script type="text/javascript" src="/Scripts/file-upload/jquery.fileupload.js?cdv=1">
<script type="text/javascript" src="/Scripts/file-upload/jquery.fileupload-process.js?cdv=1">
<script type="text/javascript" src="/Scripts/file-upload/jquery.fileupload-main.js?cdv=1">
<script type="text/javascript" src="/Scripts/file-upload/jquery.fileupload-validate.js?cdv=1">
<script type="text/javascript" src="/Scripts/file-upload/jquery.iframe-transport.js?cdv=1">
<script type="text/javascript" src="/Scripts/jquery.jcrop.min.js?cdv=1">
<script type="text/javascript" src="/Scripts/imagemodel.js?cdv=1">
据我所知,验证是用jquery完成的,不显眼。 奇怪的是,如果我从控制台手动运行 $(“form”).valid(),它会返回 true,但是如果我在 $(“form”).valid() 上有“required”属性,则 $(“form”).valid() 会正确触发。
有没有办法将“必需”属性添加到必要输入中?或者,也许还有另一种方法可以进行客户端验证。
谢谢
答:
0赞
florinszilagyi
12/17/2013
#1
我所采用的解决方案是为 HtmlHelper 类创建一个扩展,该类创建自定义验证控件,其中验证属性将添加到生成的 HTML 中。
public static MvcHtmlString ValidatedTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> attributes)
{
var message = GetMessage(htmlHelper, expression);
return htmlHelper.TextBoxFor(expression, new Dictionary<string, object>(attributes)
{
{ "data-val", "true" },
{ "data-val-required", message ?? "Must not be empty"},
});
}
private static string GetMessage<TModel, TProperty>(HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
PropertyInfo[] props = metadata.ContainerType.GetProperties();
string message = null;
var info = props.First(prop => prop.Name == metadata.PropertyName);
var attribute = info.GetCustomAttribute(typeof (RequiredAttribute)) as RequiredAttribute;
if (attribute != null)
{
message = attribute.ErrorMessage;
if (string.IsNullOrEmpty(message))
{
var resource = attribute.ErrorMessageResourceType;
var resourceName = attribute.ErrorMessageResourceName;
if (resource == null || resourceName == null)
return null;
message = new ResourceManager(resource).GetString(resourceName);
}
}
return message;
}
评论
DataAnnotaions
[Required] [DisplayName("Hotel")] public string HotelName { get; set; }