2015-11-24 24 views
0

我使用SimpleCrypto library創建了自定義用戶註冊。它可以在自己的頁面上正常工作(控制器UserController,動作Registration,查看Registration)。然後我想使用ajax在主頁上的模態窗口中進行註冊。使用ajax進行自定義用戶註冊不起作用(ASP.NET MVC4)

我創建局部視圖_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 --> 

,並添加其主頁上

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

這是我的.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); 
}); 

它是我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); 
     } 
    } 
} 

它的工作原理,並在數據庫中增加用戶,並顯示在模態窗口錯誤,如果形式的任何字段無效(空或不正確的數據)。
但同時還有一些問題我無法修復。

首先,如果ModelState.IsValid是不正確的,或者如果IsUserExist(registerUser.Email)返回true,我沒有得到我的任何形式的錯誤,ModelState.AddModelError("", "User already exists");ModelState.AddModelError("", "Неправильные данные");不起作用。

而第二個,如果用戶註冊成功,重定向return RedirectToAction("Index", "Task");不起作用,我不知道爲什麼。

如何解決這些錯誤?

+0

但是你只使用console.log(「ok」);您需要將當前窗口替換爲從服務器獲得的內容。是這樣嗎? –

+0

其實這是我第一次嘗試創造一些東西,所以我不知道該怎麼做。 – Heidel

+0

嗯,我不認爲我需要替換一些東西。我需要以某種方式顯示錯誤,如果模型狀態無效或者用戶已經存在或者如果註冊成功則重定向到其他頁面。 – Heidel

回答

1

一個可能的(和相當簡單)選項:在您的控制器你喜歡的SMT

  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"); 
      } 

然後在JS說以下。我使用這兩個選項,成功和錯誤,所以你可以刪除完成和失敗的方法。

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 */ 
     } 
    }; 

至於重定向。再一次,阿賈克斯不希望被重定向。這就是爲什麼當你獲得成功案例時你需要手動重定向。

+0

有什麼方法可以在頁面上顯示'statusDescription'嗎? – Heidel

+1

$(「#description」)。text(statusDescription)?這是當然僞代碼:) –

+0

Actully我不知道,也許我應該不會返回'HttpStatusCodeResult',但在這裏的其他一些結果類型? '返回Json(data,JsonRequestBehavior.AllowGet);',例如?在頁面上發送代碼和消息? – Heidel