0

您好,这是我第一次使用 .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");
                }

但它不会将我重定向到任何地方......我真的不明白会发生什么

编辑:我认为模型是空的

4

5 回答 5

1

model如果您有任何模型错误,您不会在控制器操作中将您的 as 重载传递给您的视图。

If(ModelState.IsValid)
{
     //your code
}
else
{
    return View(model);//You did not pass this 
}

同样在你看来,你从来没有ViewBag.Message看到你changePasswordSucceeded是否失败过。正如您所说,控制器没有显示任何可能失败的内容。

您应该@ViewBag.Message在您的视图中使用以检查是否有任何错误。

于 2013-02-04T17:04:40.823 回答
1

如果您怀疑它可能是 Firefox 做的(该对话框弹出),请尝试使用 Chrome。在 Chrome 中导航到您尝试调试的页面,在您点击 [提交] 之前,点击 F12 以调出开发人员工具,然后切换到网络选项卡。在打开切换包到页面并点击提交之后,确保您在那里看到一个条目,它试图联系服务器。如果确实如此,您可以在服务器上的操作中调试问题,如果“网络”选项卡中没有显示任何内容,那么客户端验证可能认为它无效并阻止它提交到服务器。

于 2013-02-04T16:53:51.257 回答
1

在 BeginForm 中提及您的操作和控制。

@Html.BeginForm("action","controller", FormMethod.Post);
于 2013-02-04T16:06:47.607 回答
0

删除尝试。看看有没有什么坏处。

于 2013-02-04T17:12:25.193 回答
0

当我现在发现问题时,我回答了我自己的问题:代码是正确的,问题出在 Action 链接中,它没有向Controller发送正确的UserId 。

ViewBag.Message = UserId我通过传递给View发现了问题,所以我意识到它是空的。固定的

于 2013-02-04T18:48:39.390 回答