私は構築しているasp.net mvc5のウェブサイトで働いているユーザーアカウント管理を取得しようとしています。新しいユーザー作成はほとんど機能していますが、ユーザーの作成時に例外がスローされたときにエラーを表示するのに問題があります。例外はキャッチされ/処理され、エラーメッセージがAdminControllerのCreate()アクションのModelStateオブジェクトに追加されますが、Createビューに戻るとエラーは表示されません。Asp.net MVC5 Html.ValidationSummary(false)が例外エラーを表示しないのはなぜですか?
例外がスローされないその他のタイプのユーザー作成エラーは正しく表示されます。副次的な問題として、ブラウザ上の「スピナー」が停止せず、作成アクションを開始した投稿が完了していないことを示しています。ブラウザのメニューをクリックすると、新しいページに移動し、スピナーが消えます。
正しく表示され、例外に関連付けられていないのcreate()エラーが発生:
var newUserCreateResult = UserManager.Create(newUser, password)
戻り値:
newUserCreateResult.Succeeded == false
をANとに関連付けられていることを作る()エラー例外およびが正しく表示されない場合:
await UserManager.SendEmailAsync(newUser.Id, "Reset Password", "Please confirm your account and reset your password by clicking <a href=\"" + callbackUrl + "\">here</a>");
は例外をスローします。私はSmtpMailServiceを使用していますが、電子メールサーバーにアクセスできない場合、またはsmtpアカウントの設定が正しくない場合に例外がスローされます。
私が試したいくつかの点:手動で作成ビュー内にModelState エラーを反復処理することによって、エラーのリストを作成する
- をHtml.ValidationSummary @(真)
- 。デバッガは、コードが実行され、 を示しますが、それでも表示されません。
私の()アクションを作成します。
// PUT: /Admin/Create
[Authorize(Roles = "Admin")]
[HttpPost]
[ValidateAntiForgeryToken]
#region public ActionResult Create(CreateUserDTO createUserDTO)
public async Task<ActionResult> Create(CreateUserDTO createUserDTO) {
ApplicationUser newUser = null;
try {
if (createUserDTO == null) {
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var Email = createUserDTO.Email.Trim();
if (Email == "") {
throw new Exception("No Email");
}
// Create user
newUser = new ApplicationUser { UserName = Email, Email = Email };
var password = Membership.GeneratePassword(8, 3) + "aaZZ09";
var newUserCreateResult = UserManager.Create(newUser, password);
if (newUserCreateResult.Succeeded == true) {
UserManager.AddToRole(newUser.Id, createUserDTO.SelectedRole);
string code = await UserManager.GeneratePasswordResetTokenAsync(newUser.Id);
code = HttpUtility.UrlEncode(code);
var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = newUser.Id, code = code }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(newUser.Id, "Reset Password", "Please confirm your account and reset your password by clicking <a href=\"" + callbackUrl + "\">here</a>");
return Redirect("~/Admin");
} else {
// Html.ValidationSummary displays these errors correctly
foreach (string msg in newUserCreateResult.Errors) {
ModelState.AddModelError(string.Empty, msg);
}
}
} catch (Exception ex) {
// Html.ValidationSummary DOESN NOT display these errors
ModelState.AddModelError(string.Empty, ex.Message);
}
if (newUser != null) {
UserManager.Delete(newUser);
}
createUserDTO.Roles = GetAllRolesAsSelectList();
return View("Create", createUserDTO);
}
マイCreate.cshtmlビュー:(私は私のPCを再起動した後?)
@model Nissan.Models.CreateUserDTO
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm("Create", "Admin", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) {
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Create User</h4>
<hr />
@Html.ValidationSummary(false, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Email,
htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Email,
new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Email, "",
new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Roles,
htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.SelectedRole, (Model == null) ? null : Model.Roles);
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
@Html.ActionLink("Cancel",
"Index",
null,
new { @class = "btn btn-default" })
</div>
</div>
</div>
}