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

问题描述 投票:0回答:3

当用户在文本字段中输入用户名时,我正在使用asp.net mvc 4jquery 1.9.1检查用户名的可用性。由于某种原因,我在浏览器控制台中得到了Internal Server Error 500。这是我的代码,

Controller

    [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是否已存在用户名?急需此帮助!谢谢。

jquery ajax asp.net-mvc
3个回答
1
投票

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

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

将返回找不到的null,因此您的以下代码行

if (prevUser.username == username)

将抛出NullReferenceException,因为您无法访问usernamenull属性>

将代码更改为

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()事件。

    ] >
  2. 使用'@Url.Action("chkPrevUser", "Home")'代替"/Home/chkPrevUser"以确保您的网址始终正确生成

服务器错误500表示服务器在大多数情况下会引发异常。调试您的方法,然后查看导致异常的原因。

[[Remote]]属性在此上应像魅力一样。尝试这些步骤,它对我的​​应用程序有效。

1] Model文件夹中的Viewmodel类

[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类Model创建新的视图“ Signup”。

现在,尝试,一旦从“注册”表单的“用户名”字段中跳出,您将看到错误。


0
投票

服务器错误500表示服务器在大多数情况下会引发异常。调试您的方法,然后查看导致异常的原因。


0
投票

[[Remote]]属性在此上应像魅力一样。尝试这些步骤,它对我的​​应用程序有效。

© www.soinside.com 2019 - 2024. All rights reserved.