我试图解决这样一个事实:当他们编写asp.net MVC 3时,他们忘记包含代码来添加不显眼的验证属性到选择列表,他们的"修复"就是将它包含在MVC 4中,这不是血腥的使用MVC 3的任何人.
我建议的解决方法是使用Html.GetUnobtrusiveValidationAttributes()自己添加它们,就像任何其他自定义属性一样,但我无法确定调用方法的正确语法.有2个重载,一个接受一个字符串,另一个接受一个字符串和一个ModelMetaData类.我理解元数据参数,我认为我只是传入ViewData.ModelMetadata但字符串应该是什么?MSDN文档说它是"指定的HTML名称属性",这对我来说毫无意义.HTML名称属性是什么?选择清单?为什么它需要它以及它如何帮助它知道我的模型上我想要验证的属性?查看使用示例,他们似乎都传递了我的模型上属性的名称,我想要验证属性,这是有道理的.不幸的是,无论我传递什么,我都无法让方法返回任何空集合.
我的模型类叫做Event,我的属性叫做EventTypeID.我使用稍微不同的viewmodel类作为视图的基础,因为我需要显示事件列表,并且还允许在同一视图上输入新事件,因此我有一个简单的viewmodel类,如下所示:
public class EventViewModel
{
public Model.Event NewEvent { get; set; }
public IEnumerable<Model.Event> Events { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
下拉列表映射到属性,如:@Html.DropDownListFor(model => model.NewEvent.EventTypeID我将作为字符串传递给Html.GetUnobtrusiveValidationAttributes(string)或Html.GetUnobtrusiveValidationAttributes(string, ModelMetadata)获取此属性的属性.我试过了:
Html.GetUnobtrusiveValidationAttributes("EventTypeID")
Html.GetUnobtrusiveValidationAttributes("EventTypeID",ViewData.ModelMetadata)
Html.GetUnobtrusiveValidationAttributes("NewEvent.EventTypeID")
Html.GetUnobtrusiveValidationAttributes("NewEvent.EventTypeID",ModelMetadata)
Run Code Online (Sandbox Code Playgroud)
他们都返回一个空集合.
我知道我的模型是正确的,因为如果我将调用更改Html.DropDownListFor为Html.TextBoxFor然后验证"正常工作",除了将验证属性添加到我的模型类之外,我不需要做任何事情.
编辑:
刚尝试关闭客户端验证,验证在所有选择列表的服务器端都很好.
我有ASP.Net MVC3应用程序,其中有一个部分页面加载了大量的html控件(在Count = 980附近),并为其分配了验证.
JQuery Unobtrusive验证需要很长时间才能使用上述控件验证表单.它达到了应用程序的性能.有没有办法改进,如何对DOM的元素进行验证?
我有一种情况,当我尝试检查表单是否有效,但form.valid()始终返回true.但是,如果我尝试验证单个控件,则返回false.
这是我的表格:
<div class="profilestagsedit">
@using (Html.BeginForm("", "", FormMethod.Post, new { id = "tagsform" }))
{
@Html.ValidationMessageFor(x => x.EditTagsText)
@Html.TextBoxFor(p => p.EditTagsText, new
{
@id = "txtprofileedittags"
})
}
</div>
Run Code Online (Sandbox Code Playgroud)
这是我的viewmodel:
[Required(AllowEmptyStrings = false, ErrorMessage = "Please enter at least one Tag ")]
public string EditTagsText { get; set; }
Run Code Online (Sandbox Code Playgroud)
这是jQuery代码:
$('#tagsform').removeData("validator");
$('#tagsform').removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse('#tagsform');
$('#tagsform').validate();
Run Code Online (Sandbox Code Playgroud)
在保存按钮上单击:
var isValid = $('#tagsform').validate().element($('#txtprofileedittags')); <-- false
$('#tagsform').valid() true <--
Run Code Online (Sandbox Code Playgroud)
我想form.valid()也返回false,我做错了什么?
我有JQuery弹出窗口,我想在其上放置必要的字段验证,为此我已经在模型中设置了必需的属性,并且还在视图中为它们设置了验证消息,但是必需的字段验证不适用于弹出窗口.必需的字段验证在JQuery Popups以外的表单上工作正常....请指导我应该怎么做才能解决这个问题...以下是我的代码.
模型
[Display(Name = "Material Code")]
[Required(ErrorMessage = "*")]
public string MaterialCode { get; set; }
Run Code Online (Sandbox Code Playgroud)
视图
<li>
@Html.LabelFor(m => m.MaterialCode)
@Html.TextBoxFor(m => m.MaterialCode)
@Html.HiddenFor(m => m.MaterialCodeId)
</li>
Run Code Online (Sandbox Code Playgroud)
以下是我的鳕鱼eto打开一个JQuery弹出窗口.
$('#btnAddCharge').on('click', function (event) {
event.preventDefault();
var actionURL = '@Url.Action("Edit", "Charges", new { Id = 0, @ticketId = @TicketId, UserId = UserId })';
$(dialogBox).dialog({
autoOpen: false,
resizable: false,
title: 'Edit',
modal: true,
show: "blind",
width: 'auto',
hide: "blind",
open: function (event, ui) {
$(this).load(actionURL, function (html) {
$('form', html).submit(function () { …Run Code Online (Sandbox Code Playgroud) javascript validation asp.net-mvc jquery unobtrusive-validation
我使用ASP.NET MVC 3与unobstrusive验证JavaScript.我也在使用jquery ui标签,我想选择一个包含无效消息元素的标签.
因此,为此,我需要在评估jquery.validate之后调用脚本.
我试过这样的:
$(':submit').submit(function () {
var invalidField = $(".input-validation-error");
if (invalidField ) {
tabid = //some script to detect wich tab contains the invalidField
$('#someTabed').tabs('select', tabid));
}
});
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我点击提交按钮TWICE.这意味着在我想要的事件之后不会调用此方法.
所以我需要知道如何拦截由不引人注意的验证所做的验证方法,然后在我之后使用我的方法.
我有一个包含日期和日期时间字段的表单:
@Html.TextBoxFor(model => model.A, new { @type = "datetime" })
@Html.TextBoxFor(model => model.B, new { @type = "date" })
Run Code Online (Sandbox Code Playgroud)
模型:
public class TestModel
{
[DataType(DataType.Date)]
public DateTime A {get;set;}
[DataType(DataType.Date)]
public DateTime B {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
通过使用这些输入类型,iPad显示了不错的日期(时间)选择器.使用客户端验证验证字段.对于datetime字段(A),它可以工作,但是日期字段(B)将引发错误:"请输入有效日期." 我该如何解决这个问题?
例子:
在iPad上调试代码很难,所以我不知道Safari在设置输入的value属性时如何更改日期格式.
编辑:我发现日期时间格式是通用日期时间格式(yyyy-MM-DDTHH:mmZ),而日期格式是yyyy-MM-dd.可能客户端验证器确实了解通用日期时间,而不是yyyy-MM-dd由于本地化.
我想使用ComponentModel DataAnnotations验证两个属性中至少有一个属性值.我的模型看起来像这样:
public class FooModel {
public string Bar1 { get; set; }
public int Bar2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
基本上,我想验证FooModel,以便需要Bar1 或 Bar2.换句话说,您可以输入一个,或另一个,或两者,但您不能将它们都留空.
我希望这对于服务器端和不显眼的客户端验证都有效.
编辑:这可能是重复,因为这看起来类似于我想要做的
在我正在开发的页面中,我有一个"电子邮件"字段和"ConfirmEmail"字段.并且要求是进行不区分大小写的比较.
我可以创建一个自定义属性并扩展内置的"Compare"属性的行为.这适用于服务器端.
但我无法在客户端实现它.我确信我们必须做一些额外的事情来使不引人注目的jquery做一个不区分大小写的比较.
使用MVC4启用客户端和不显眼验证,我试图了解验证如何确定输入的DateTime值是否有效.
在我的应用程序中,此格式化日期有效:01/31/2013,如果我输入:31/01/2013,我得到:
字段[fieldId]必须是日期
它如何确定什么是有效日期?
asp.net-mvc jquery-validate unobtrusive-validation asp.net-mvc-3 asp.net-mvc-4
我需要为表单验证失败的任何情况添加句柄.
我已经读过这个,这解释了我必须添加一个处理程序,如下所示:
$('form').bind('invalid-form.validate', function () {
console.log('form is invalid!');
});
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试提交表单时,此事件才会触发.
我需要处理一个事件,该事件在表单经过后验证时被触发(即元素失去焦点等).
我想要实现的是,我有一个大型(~50个字段),并且它在Bootstrap选项卡中分割.
我想,当有任何新的验证失败或成功时,在包含无效/有效元素的选项卡的选项卡标题中设置或清除错误类.PS我的问题不在于如何在选项卡中设置这些类.我只想知道要处理哪些事件,以便在整个表单中的每个验证状态更改时得到通知.