我需要在ASP.NET MVC 4(C#)应用程序中使用远程验证来验证FirstName,LastName和Email Address组合的副本.远程验证只接受一个AdditionalFields,如下所示:
[Remote("IsUserNameAvailable", "User", AdditionalFields="LastName" )]
public string FirstName{ get; set; }
public string LastName{ get; set; }
public string EmailAddress{ get; set; }
Run Code Online (Sandbox Code Playgroud)
如何为组合添加EmailAddress?
我需要在提交表单之前验证用户的输入字段值.
我在自定义控制器中创建了一个动作并用它装饰了该字段:
动作名称: CheckValue
控制器名称: Validate
[Remote("CheckValue", "Validate"), ErrorMessage="Value is not valid"]
public string Value { get; set; }
Run Code Online (Sandbox Code Playgroud)
问题是当我按提交时,表单正在提交,然后Value is not valid如果用户输入的值无效则显示消息.
如何验证用户输入的值并阻止在值无效时提交表单,并显示错误消息?
如果我尝试在JavaScript中检查表单是否有效$("#formId").valid()并返回true,则表示无论表的值是什么(有效与否),表单都有效.
另一方面,如果我用[Required]属性装饰另一个字段,则表单未提交,并且显示该字段所需的错误.但是,远程验证字段的场景后面不会进行验证.
我有以下型号:
public class Customer
{
public string FirstName {get;set;}
public string LastName {get; set;}
[Remote("CardExisting", "Validation", AdditionalFields="FirstName,LastName")
public string CardNumber {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
CardExisting操作将检查firstName和LastName的cardNumber组合是否存在现有记录.
如果用户首先输入卡号然后输入他的名字,我无法验证他怎么办?所以当他返回并输入他的名字时我需要再次进行远程验证,如果焦点已经从cardnumber属性丢失了怎么办呢?
这是一个经典的登录流程.用户可以在"新用户"或"现有用户"之间进行选择.如果用户是新用户,则登录框中的名称应该针对服务器进行验证以查看用户名是否是唯一的,如果是现有用户,则将跳过此检查,因为我们希望已经(当然)采用了用户名.
我在viewmodel上添加了一个[Remote]属性,并为新/退出用户添加了radiobutton作为"附加字段".这样,如果是现有用户,远程验证将返回true,如果不是,则检查数据库,以查看是否采用了用户名.
这很有效,除非用户在输入用户名后决定更改单选按钮(新/现有)(并且远程验证已运行).由于远程验证仅在用户名更改时自动运行(即具有[Remote]属性的属性),因此单独更改单选按钮不会再次运行.
所以我的问题是,如何强制远程验证再次运行?我通过在用户名输入字段上触发更改/焦点/模糊事件来尝试通常的黑客攻击,但是不会触发调用.我认为增加的单选按钮类似[远程],但是这将事情真的有两个相等的寻找错误信息,放置在同一个绝对位置复杂化.
有没有办法触发重新验证?
在MVC3应用程序中,使用jquery不显眼的验证,以及带有[Remote]验证器的视图/模型:我正在尝试禁用提交按钮并在远程验证期间显示等待图标,并且当有效表单提交给服务器时.我以为我已经把它钉在了IE8上.
问题是,当表单无效时,GC和FF没有触发表单的提交事件,因此我在此事件期间禁用了提交按钮.但是,当表单无效时,IE8会触发此事件,导致用户永远无法再次单击它.(IE8不提交表单,但事件被解雇.)
我尝试将一个函数附加到提交按钮的单击事件.在那里,我禁用了提交按钮,显示了等待图标,并且有:
$('[data-app-form-submit-button="true"]').live('click', function (e) {
var form = $(this).parents('form');
var icon = form.find('[data-app-form-submitting-icon="true"]');
icon.show();
$(this).attr('disabled', 'disabled');
$.ajaxSetup({ async: false });
var isValid = form.valid();
$.ajaxSetup({ async: true });
alert(isValid);
});
Run Code Online (Sandbox Code Playgroud)
问题是,ajax设置调用并没有真正关闭异步.如果我将它移出click函数,但它会禁用所有内容的异步.相反,页面立即警告"true",通过在远程验证操作方法上设置断点进行测试.
有任何想法吗?
附加说明:
我忘了提一下,在IE8中,当有问题的文本框未能在客户端上进行验证时,才会触发提交事件.例如,如果它不需要或正则表达式,则触发submit().对于远程验证操作方法,不会触发它.但是,一旦客户端验证失败,后续远程验证也会触发IE8提交事件.
对Russ Cam的回应(评论#1)
以下是viewmodel中的相关代码:
public class SignUpForm : IValidatableObject
{
[DataType(DataType.EmailAddress)]
[Display(Name = "Email Address")]
[Required(ErrorMessage = "Email Address is required.")]
[RegularExpression(@"^(email regex here)$",
ErrorMessage = "This is not a valid email address.")]
[Remote("Validate", "ControllerName", "AreaName", HttpMethod = "POST")]
public string EmailAddress { get; set; …Run Code Online (Sandbox Code Playgroud) jquery jquery-validate unobtrusive-validation asp.net-mvc-3 remote-validation
我有一个启用了远程验证的视图模型.在我看来,我也禁用了OnKeyUp
$(function() {
$.validator.setDefaults({ onkeyup: false });
})
Run Code Online (Sandbox Code Playgroud)
但是,如果我专注于文本框,并将焦点移动到另一个控件,则根本不会触发远程验证.
当我将它配置为onBlur和空字符串时,有没有办法可以让远程验证触发?
根据https://www.mikesdotnetting.com/article/343/improved-remote-validation-in-razor-pages 我按照教程并实施了 PageRemote。但是,如果应用于模型的属性并且我将模型用作属性,则它不起作用。
public class Draft
{
public int Id { get; set; }
[PageRemote(ErrorMessage = "Invalid data", AdditionalFields = "__RequestVerificationToken", HttpMethod = "post", PageHandler = "CheckReference")]
public string Reference { get; set; }
}
[BindProperty]
public Draft Draft { get; set; }
public JsonResult OnPostCheckReference()
{
var valid = !Draft.Reference.Contains("12345");
return new JsonResult(valid);
}
Run Code Online (Sandbox Code Playgroud)
在我的页面上
<tab>
<tab-item icon="fas fa-arrow-left" url="@Url.Page("../Index")"></tab-item>
<tab-item icon="fas fa-list" url="@Url.Page("Index")"></tab-item>
<tab-item icon="fas fa-plus" is-active="true"></tab-item>
</tab>
<form method="post">
<card>
<card-header icon="fas fa-plus" title="Draft"></card-header>
<card-body>
<input …Run Code Online (Sandbox Code Playgroud) 我有两个类,我用作两个不同视图的模型.您可以看到第二个类包含第一个类的实例.第一个包含远程验证属性.
[MetadataType( typeof( ExceptionLogModel.EmailRecipientMetadata ) )]
public class EmailRecipientViewModel
{
public int EmailRecipientID { get; set; }
[Remote( "ValidateEmailRecipientNameUniqueness", "EmailRecipient", ErrorMessage = "Name is not unique." )]
public string Name { get; set; }
[Remote( "ValidateEmailRecipientEmailUniqueness", "EmailRecipient", ErrorMessage = "Email is not unique." )]
public string Email { get; set; }
}
public class EmailRecipientChoices
{
public List<EmailRecipient> UnselectedEmailRecipients { get; set; }
public List<EmailRecipient> SelectedEmailRecipients { get; set; }
public EmailRecipientViewModel EmailRecipient { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当这些验证在浏览器中触发时,将根据视图使用的类生成两个不同的请求.您可以看到查询字符串参数名称不同:
http://localhost:55327/EmailRecipient/ValidateEmailRecipientNameUniqueness?Name=sdhsdgh …Run Code Online (Sandbox Code Playgroud) public class UserModel
{
public LogOnModel LogOnModel { get; private set; }
public RegisterModel RegisterModel { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的RegisterModel中,我有这样的电子邮件地址:
[RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$")]
[Required]
[Display(Name = "E-mail")]
[Remote("IsEmailAddressAvailable", "Validation", HttpMethod = "POST")]
public string EmailAddress { get; set; }
Run Code Online (Sandbox Code Playgroud)
我的validationController:
public class ValidationController : Controller
{
public JsonResult IsEmailAddressAvailable([string emailAddress)
{
return Json(false, JsonRequestBehavior.AllowGet);
}
}
Run Code Online (Sandbox Code Playgroud)
视图@Model是UserProfile,ValidationController中的emailAddress为null.
我试图将ValidationController更改为这样,没有运气:
public class ValidationController : Controller
{
public JsonResult IsEmailAddressAvailable([Bind(Include = "EmailAddress")]RegisterModel register)
{
return Json(false, JsonRequestBehavior.AllowGet);
}
}
Run Code Online (Sandbox Code Playgroud) 我在一个模型中有 2 个属性承包商 1 和承包商 2,如何对它们使用单个远程验证
[Display(Name ="Contractor 1:")]
[Remote("ValidateContractor", "Contracts")]
public string Cntrctr1 {get; set;}
[Display(Name = "Contractor 2:")]
[Remote("ValidateContractor", "Contracts")]`enter code here`
public string Cntrctr2 {get; set;}
Run Code Online (Sandbox Code Playgroud)
控制器中的远程验证功能
public JsonResult ValidateContractor1(string Cntrctr)
{
var valid = Validations.ValidateContractor(Cntrctr);
if (!valid)
{return Json("Enter correct contractor", JsonRequestBehavior.AllowGet);}
else{return Json(true, JsonRequestBehavior.AllowGet);}
}
public static bool ValidateContractor(string CntrctrNM)
{
bool valid;
using (var entities = new CAATS_Entities())
{
var result = (from t in entities.PS_VENDOR_V
where (t.VNDR_1_NM).Equals(CntrctrNM)
select t).FirstOrDefault();
if (result != null) …Run Code Online (Sandbox Code Playgroud)