简体   繁体   English

使用ajax进行自定义用户注册不起作用(ASP.NET MVC4)

[英]Custom user registration with ajax doesn't work (ASP.NET MVC4)

I created custom user registration using SimpleCrypto library . 我使用SimpleCrypto库创建了自定义用户注册。 It works fine on its own page (controller UserController , action Registration , view Registration ). 它可以在自己的页面上正常工作(控制器UserController ,action Registration ,view Registration )。 Then I would like to make this registration in modal window on main page using ajax. 然后,我想使用ajax在主页的模式窗口中进行此注册。

I created partial view _Registration.cshtml 我创建了部分视图_Registration.cshtml

@model TaskManager.Models.RegisterUserModel

<div class="modal fade" id="registrationModal">
  <div class="modal-dialog">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <h2 class="modal-title">Registration</h2>
        </div>

        @using (Html.BeginForm("Registration", "User", FormMethod.Post, new { @class = "registration-form", id = "registration-form" }))
        {
            @Html.AntiForgeryToken()
            @Html.ValidationSummary(true)

            <div class="modal-body">
                 <div class="form-group">
                    @Html.LabelFor(u => u.Name)
                    @Html.TextBoxFor(u => u.Name, new { @class = "form-control" })
                    @Html.ValidationMessageFor(u => u.Name, null, new { @class = "error" })
                </div>

                <div class="form-group">
                    @Html.LabelFor(u => u.Email)
                    @Html.TextBoxFor(u => u.Email, new { @class = "form-control" })
                    @Html.ValidationMessageFor(u => u.Email, null, new { @class = "error" })
                </div>

                <div class="form-group">
                    @Html.LabelFor(u => u.Password)
                    @Html.PasswordFor(u => u.Password, new { @class = "form-control" })
                    @Html.ValidationMessageFor(u => u.Password, null, new { @class = "error" })
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                <input type="submit" class="btn btn-primary" value="Register">
            </div>
        }

    </div><!-- /.modal-content -->
  </div><!-- /.modal-dialog -->
</div><!-- /.modal -->

and added it on home page 并将其添加到主页上

<a href="#" data-toggle="modal" data-target="#registrationModal">registration</a>
@Html.Partial("~/Views/User/_Registration.cshtml")

it's my .js file 这是我的.js文件

/* -------------- DOM READY -------------- */
$(document).ready(function () {
"use strict";

var $body = $("body");

var ajaxRegistration = function () {
    var $form = $(this);

    var options = {
        url: $form.attr("action"),
        type: $form.attr("method"),
        data: $form.serialize()
    };

    console.log(options);
    $.ajax(options).done(function (data) {
        console.log("ok");
    })
   .fail(function () {
       console.log("error");
   });

    return false;
};
$("#registration-form").submit(ajaxRegistration);
});

And it's my UserController 这是我的UserController

namespace TaskManager.Controllers
{
    public class UserController : Controller
    {
        TaskManagerDbContext _db = new TaskManagerDbContext();

        [HttpGet]
        [AjaxAction]
        public ActionResult Registration()
        {
            var registerUser = new RegisterUserModel();
            return PartialView("_Registration", registerUser);
        }

        [HttpPost]
        [AjaxAction]
        public ActionResult Registration(RegisterUserModel registerUser)
        {            
            if (ModelState.IsValid)
            {
                if (!IsUserExist(registerUser.Email))
                {    

                    var crypto = new SimpleCrypto.PBKDF2();

                    var encrpPass = crypto.Compute(registerUser.Password);

                    var newUser = _db.Users.Create();

                    newUser.Name = registerUser.Name;
                    newUser.Email = registerUser.Email;
                    newUser.Type = UserType.User.ToString();

                    newUser.Password = encrpPass;
                    newUser.PasswordSalt = crypto.Salt;

                    _db.Users.Add(newUser);
                    _db.SaveChanges();

                    return RedirectToAction("Index", "Task");

                }
                else
                {
                    ModelState.AddModelError("", "User already exists");
                }
            }
            else
            {
                ModelState.AddModelError("", "Data is incorrect");
            }

            return PartialView("_Registration", registerUser);
        }

        private bool IsUserExist(string email)
        {
            bool IsValid = false;

            var user = _db.Users.FirstOrDefault(u => u.Email == email);

            if (user != null)
            {
                IsValid = true;
            }

            return IsValid;
        }

        protected override void Dispose(bool disposing)
        {
            if (_db != null)
            {
                _db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}

It works and adds user in database and shows errors in modal window if any field of form is not valid (empty or incorrect data). 如果任何形式的字段无效(空或不正确的数据),它将起作用并在数据库中添加用户,并在模式窗口中显示错误。
But at the same time there are some problems I can't fix. 但是同时有些问题我无法解决。

First of all, if ModelState.IsValid is not true or if IsUserExist(registerUser.Email) return true, I don't get any errors in my form, ModelState.AddModelError("", "User already exists"); 首先,如果ModelState.IsValid不为true或IsUserExist(registerUser.Email)返回true,则我的表单没有出现任何错误, ModelState.AddModelError("", "User already exists"); and ModelState.AddModelError("", "Неправильные данные"); ModelState.AddModelError("", "Неправильные данные"); don't work. 不工作

And the second one, if user was registered successfully, redirect return RedirectToAction("Index", "Task"); 第二个,如果用户注册成功,则重定向return RedirectToAction("Index", "Task"); doesn't work, I don't know why. 不起作用,我不知道为什么。

How to fix these bugs? 如何修复这些错误?

One possible (and rather simple) option: in your controller you do smt like 一种可能(且相当简单)的选择:在控制器中,您确实喜欢

           if (ModelState.IsValid)
            {
                if (!IsUserExist(registerUser.Email))
                { 
                    // bad here
                    //return RedirectToAction("Index", "Task");
                    return new HttpStatusCodeResult(HttpStatusCode.OK); //at least
                }
                else
                {
                  return new HttpStatusCodeResult(HttpStatusCode.InternalServerError, "User already exists");
                }
            }
            else
            {
               return new HttpStatusCodeResult(HttpStatusCode.InternalServerError, "Data is incorrect");
            }

And then in js say the following. 然后在js中说以下内容。 I use these 2 options, success and error, so you can remove methods done and fail. 我使用这两个选项(成功和错误),因此您可以删除完成和失败的方法。

var options = {
        url: $form.attr("action"),
        type: $form.attr("method"),
        data: $form.serialize()
        success: function() {/*redirect here*/},
        error: function (e) {
            alert(e.statusText); /* show the error */
        }
    };

As for redirecting. 至于重定向。 Again, ajax does not expect to be redirected. 同样,ajax不会被重定向。 That's why you need to redirect manually when you get a successful case. 这就是为什么成功案例后需要手动重定向的原因。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM