我有一个MVC 5正常应用程序。
在textbot中,用户需要编写广告用户名(或者可能是“姓氏姓氏”)。我使用[Remote] Annotation并调用控制器上的Validation函数。
进入Validation函数我创建一个LDAP查询,如果我只找到1个结果,则认为是验证,否则如果找不到任何结果或者找到多于1个结果,则返回false。
直到这里,没有问题。
如果验证没问题,我会用精确的AD用户名设置文本框值(或隐藏值)。
例如: 在我的域中有用户marco.rossi,并且是AD中唯一的Marco。 如果我在AD中搜索“Marco”就可以了。但是当用户提交时我想通过域名\ marco.rossi。
所以我会将文本框值从marco更改为domain \ marco.rossi。
如何将Textbox值设置为验证功能?
提前谢谢。
答案 0 :(得分:0)
好的,经过大量搜索,解决方案不是最佳解决方案,但它正在运行。
我读过这篇文章:http://www.garethelms.org/2011/01/asp-net-mvc-remote-validation-what-about-success-messages/
Gareth建议修改jquery.validate.js
在“hack”之后,对于每个REMOTE验证,都称为具有{Action name} _response name的javascript函数。
所以对此:
[Required]
[Remote("CheckADUserValidation", "CONTROLLER")]
public virtual string ad_username { get; set; }
我提供了这个功能:(在视图的脚本部分)
function CheckADUserValidation_response(bIsValid, aErrors, oValidator)
{
// I disable immediatly the submit button to wait the right username
// so, also if validation is ok, I cannot submit until the right value is on the ad_username textbox
$('#btnSubmit').attr('disabled', 'disabled');
if (bIsValid == true) {
// after I call an Ajax on an Action, that instead of giving me true or error messages, give me the username
$.ajax({
type: "GET",
dataType: 'json',
url: '/CONTROLLER/ActionToHaveUsername/',
contentType: 'application/json;charset=UTF-8;',
async: true,
data: 'ad_username=' + $('#ad_username').val(),
success: function (response) {
if (response != '') {
// Ok there is the response
$('#ad_username').val(response);
$('#btnSubmit').removeAttr('disabled');
return true;
} else {
$('#btnSubmit').attr('disabled', 'disabled');
return false;
}
},
error: function (jqXHR, textStatus, errorThrown) {
alert(textStatus);
},
complete: function (jqXHR, textStatus) {
}
});
} else {
return false;
}
}
这是在Controller上调用的Action:
public JsonResult ActionToHaveUsername(string ad_username)
{
string tmpADName;
JsonResult tmpResult = new JsonResult();
// this function make the dirty work to take in input a name and search for unique ActiveDirectory Username, and return me in tmpADNName
AppGlobals.functions.CheckADUserValidation(ad_username, out tmpADName);
tmpResult.Data = tmpADName;
tmpResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
return tmpResult;
}
最好的结果是将ajax请求封装到500ms后触发的计时器中,因为我注意到有时远程验证也会在写入文本框时启动。 因此,对于每个字符,异步验证开始,但是当验证返回ok时,提交按钮被禁用,并且在500ms后第二个请求开始并更改用户名的名称。每个新角色都会重置计时器,所以只有最后一个角色才能激活第二个ajax。
最后... 2 ajax不是最佳方案,但我真的尝试使用JsonResult来获得更多数据,而不会失去验证机制。但我找不到办法。