.NET MVC模型绑定:什么都没发生
本文关键字:什么 MVC 模型 绑定 NET | 更新日期: 2023-09-27 17:57:49
你好,这是我第一次和。NET MVC 3
我有一个控制器,应该更改登录用户的密码:
public ActionResult ChangeUserPassword(string userId)
{
ChangePasswordModel model = new ChangePasswordModel() { Id = userId };
return View(model);
}
[HttpPost]
public ActionResult ChangeUserPassword(ChangePasswordModel model)
{
if (ModelState.IsValid)
{
// ChangePassword will throw an exception rather
// than return false in certain failure scenarios.
bool changePasswordSucceeded = true;
try
{
changePasswordSucceeded = userDetailsService.ChangeUserPassword(model.Id, model.OldPassword, model.NewPassword);
}
catch (Exception)
{
changePasswordSucceeded = false;
}
if (changePasswordSucceeded)
{
return View("ChangePasswordSuccess");
}
else
{
ViewBag.Message = "The current password is incorrect or the new password is invalid.";
ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
}
}
// If we got this far, something failed, redisplay form
return View();
}
public ActionResult ChangePasswordSuccess()
{
return View();
}
视图如下:
@model MVCApp.Models.ChangePasswordModel
@{
ViewBag.Title = "Change User Password";
}
<h2>Change User Password</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Change Password</legend>
@Html.HiddenFor(model => model.Id)
<div class="editor-label">
@Html.LabelFor(model => model.OldPassword)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.OldPassword)
@Html.ValidationMessageFor(model => model.OldPassword)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.NewPassword)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.NewPassword)
@Html.ValidationMessageFor(model => model.NewPassword)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ConfirmPassword)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ConfirmPassword)
@Html.ValidationMessageFor(model => model.ConfirmPassword)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
当我点击"保存"按钮时,什么也没发生。如果我做错了什么,你能建议我吗?或者如何捕捉并显示错误?
编辑:当我提交表单时,调试器没有发现任何错误
编辑:(图片因不相关而删除)
我已经更换了控制器:
if (changePasswordSucceeded)
{
return View("ChangePasswordSuccess");
}
else
{
return View("ChangePasswordFailed");
}
但它不会把我重定向到任何地方。。。我真的不明白会发生什么
编辑:我认为模型是空的
在BeginForm中提及您的操作和控制。
@Html.BeginForm("action","controller", FormMethod.Post);
如果您怀疑可能是Firefox在做这件事(弹出对话框),请尝试使用Chrome。在Chrome中导航到您试图调试的页面,在点击[Submit]之前,请按F12调出开发人员工具,然后切换到"网络"选项卡。在打开切换包到页面并点击Submit之后,请确保您在其中看到它试图联系服务器的条目。如果是这样,您可以在服务器上的操作中调试问题,如果"网络"选项卡中没有显示任何内容,那么客户端验证可能认为它无效,并阻止它提交到服务器。
如果出现任何模型错误,您不会在控制器操作中将model
作为重载传递给视图。
If(ModelState.IsValid)
{
//your code
}
else
{
return View(model);//You did not pass this
}
此外,在您看来,您从未使用ViewBag.Message
来查看您的changePasswordSucceeded
是否失败。正如你所说,控制器没有显示任何可能发生故障的信息。
您应该在视图中使用@ViewBag.Message
来检查是否存在任何错误。
删除try。看看有没有什么东西坏了。
当我现在发现问题时,我回答了自己的问题:代码是正确的,问题出现在Action链接中,该链接没有向Controller发送正确的UserId。
我通过将ViewBag.Message = UserId
传递给View发现了这个问题,所以我意识到它是空的。固定