我使用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">×</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");
不起作用,我不知道爲什麼。
如何解決這些錯誤?
但是你只使用console.log(「ok」);您需要將當前窗口替換爲從服務器獲得的內容。是這樣嗎? –
其實這是我第一次嘗試創造一些東西,所以我不知道該怎麼做。 – Heidel
嗯,我不認爲我需要替換一些東西。我需要以某種方式顯示錯誤,如果模型狀態無效或者用戶已經存在或者如果註冊成功則重定向到其他頁面。 – Heidel