mvc 5验证并更改DOM元素

时间:2016-08-05 19:31:34

标签: validation dom asp.net-mvc-5

我有一个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值设置为验证功能?

提前谢谢。

1 个答案:

答案 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来获得更多数据,而不会失去验证机制。但我找不到办法。