jquery AJAX 用户名可用性检查在asp.net mvc中不起作用

k2fxgqgv  于 2023-08-04  发布在  jQuery
关注(0)|答案(3)|浏览(88)

我使用asp.net MVC 4和jQuery 1.9.1来检查用户在文本字段中输入用户名时的用户名可用性。由于某种原因,我在浏览器控制台中获得了Internal Server Error 500
下面是我的代码:

控制器

[HttpPost]
    public JsonResult chkPrevUser(string username)
    {
        var prevUser = rentdb.Regs.Where(p => p.username == username).FirstOrDefault();

        if (prevUser.username == username)
        {
            return Json(false);
        }
        else
        {
            return Json(true);
        }
    }

字符串

查看

<script>
    $(function () {
        $("#txtUsername").keyup(function () {
            var name = $("#txtUsername").val();
            var status = $("#userStatus");
            var user = $.trim(name);
            if (user.length > 3) {
                status.html("Checking....")
                $.post("/Home/chkPrevUser", { username: name },
                            function (data) {
                                if (data == true) {
                                    status.html("<font color=green>'<b>" + name + "</b>' is available!</font>");
                                } else {
                                    status.html("<font color=red>'<b>" + name + "</b>' is not available!</font>");
                                }
                            });
            } else {
                status.html("Need more characters...");
            }
        });
    });
</script>
@using (Html.BeginForm("Register", "Home"))
{
    @Html.TextBoxFor(a => a.username, new { id = "txtUsername" })
    @Html.ValidationMessageFor(a => a.username)
}


我的代码有问题吗?我如何解决这个问题,并检查是否用户名已经存在的 AJAX ?

kfgdxczn

kfgdxczn1#

抛出500 (Internal Server Error)是因为您的查询

var prevUser = rentdb.Regs.Where(p => p.username == username).FirstOrDefault();

字符串
将返回null,但未找到匹配项,因此下面的代码行

if (prevUser.username == username)


将抛出NullReferenceException,因为您无法访问nullusername属性
将代码更改为

if (prevUser == null)
{
    return Json(false);
}
else
{
    return Json(true);
}


但是,我建议您删除脚本,改为使用RemoteAttribute,它将应用于您的属性,如

[Remote("chkPrevUser", ErrorMessage = "The user name already exists")]
public string username { get; set; }


控制器方法只需要更改为[HttpGet],并更改返回语句以添加JsonRequestBehavior.AllowGet参数(例如return Json(true, JsonRequestBehavior.AllowGet);)。有关详细信息,请参阅How to: Implement Remote Validation in ASP.NET MVC
如果您选择保留您的脚本,我建议您做以下更改
1.处理.change()事件而不是.keyup()。目前,如果用户试图输入10个字符的用户名,则会在第4至第9个字符处对服务器进行不必要的调用,这将返回恼人且无意义的错误消息。注意,RemoteAttribute最初处理.change()事件(即直到用户从文本框中跳出来才执行验证),如果无效,则在用户进行编辑时处理.keyup()事件。
1.使用'@Url.Action("chkPrevUser", "Home")'而不是"/Home/chkPrevUser"来确保您的url始终正确生成

b1zrtrql

b1zrtrql2#

服务器错误500意味着服务器在大多数情况下抛出异常。调试您的方法并查看导致异常的原因。

r6vfmomb

r6vfmomb3#

[Remote]属性应该在这方面发挥作用。尝试这些步骤,它适用于我的应用程序。
1)模型文件夹中的视图模型类

[Remote("IsAlreadySigned", "User", HttpMethod = "POST", ErrorMessage = "Username already exists in database. Try another Username")]
        public string Username { get; set; }

字符串
2)在用户控制器中创建这2个操作。

[HttpPost]
        public JsonResult IsAlreadySigned(string Username)
        {

            return Json(IsUserAvailable(Username));

        }
        public bool IsUserAvailable(string UserN)
        {
            // Assume these details coming from database  
            List<UserVM> RegisterUsers = new List<UserVM>()
        {

            new UserVM {Username = UserN }

        };
            using (Db db = new Db())
            {

                var UserId = db.User.Where(x => x.Username == UserN).Select(x => new { UserN }).FirstOrDefault();

                bool status;
                if (UserId != null)
                {
                    //Already registered  
                    status = false;
                }
                else
                {
                    //Available to use  
                    status = true;
                }

                return status;
            }
        }


3)使用UserVM类模型创建新视图“注册”。
现在,尝试,你会看到错误,只要你标签从用户名字段在注册表单.

相关问题