0

目前我正在使用一个标准的管理页面,如下所示:

public ActionResult Manage(string type = "")
    {
        ViewBag.Type = type;
        switch (type)
        {
            case "EmailAddress":
                ViewBag.EmailAddress = lol.UserProfiles.Find((int)Membership.GetUser().ProviderUserKey).EmailAddress;
                break;
            case "Password":
                break;
            default:
                break;
        }
        //ViewBag.ReturnUrl = Url.Action("Manage/" + type);
        return View();
    }

现在我的管理模型页面如下所示:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Manage(ManageViewModel model)
    {
        if (ModelState.IsValid)
        {
            if (model.EmailAddressModel != null)
            {
                try
                {
                    int userID = (int)Membership.GetUser().ProviderUserKey;
                    var User = lol.UserProfiles.First(f => f.UserId == userID);
                    User.EmailAddress = model.EmailAddressModel.EmailAddress;
                    int saveStatus = lol.SaveChanges();

                    if (saveStatus == 1)
                    {
                        ViewBag.StatusMessage = MessagesEnum.ChangeEmailSuccess;
                        return RedirectToAction("Manage/EmailAddress", "Account");

                    }
                    else
                    {
                        ModelState.AddModelError("", MessagesEnum.ChangeEmailFailed);
                    }

                }
                catch { }
            }
            else
            {
                // ChangePassword will throw an exception rather than return false in certain failure scenarios.
                bool changePasswordSucceeded;
                try
                {
                    changePasswordSucceeded = WebSecurity.ChangePassword(User.Identity.Name, model.PasswordModel.OldPassword, model.PasswordModel.NewPassword);
                }
                catch (Exception)
                {
                    changePasswordSucceeded = false;
                }

                if (changePasswordSucceeded)
                {
                    ViewBag.StatusMessage = MessagesEnum.ChangePasswordSuccess;
                    return RedirectToAction("Manage/Password", "Account");
                }
                else
                {
                    ModelState.AddModelError("", MessagesEnum.ChangePasswordFailed);
                }
                }
        }
        else
        {
        }
        return View(model);
    }

我的 ManageViewModel 类:

public class ManageViewModel
{
    public LocalPasswordModel PasswordModel { get; set; }
    public LocalEmailAddressModel EmailAddressModel { get; set; }
}

我试图做的是,如果他们访问 Manage 上的多个页面,例如 /Manage/Password 和 /Manage/EmailAddress,并且根据这些链接,它将发布不同的页面。现在首先,这是正确的做法吗/可以吗?其次,如果是,我试图在他们将电子邮件更改为 /Manage/EmailAddress 页面后传递一条成功消息,但 ViewBag.StatusMessage 没有在我的 HTML 页面上输出任何内容。这是为什么?

我做了更多的研究,这是我的发现(告诉我它是否正确)。所以我应该编辑路线设置等等:

routes.MapRoute(
            name: "Manage",
            url: "Account/{controller}/{action}/{id}",
            defaults: new { controller = "Manage", action = "Index", id = UrlParameter.Optional}
        );

只需创建一个名为 Manage 的新控制器,并在控制器内为不同页面(如 ChangeEmail 和 ChangePassword)创建新功能?

4

1 回答 1

0

ViewBag 和 ViewData 仅对当前请求有效,如果您执行重定向 RedirectToAction,它们将无法生存。请改用 TempData。检查以下内容:ViewBag、ViewData 和 TempData

如果你希望你的 URL 是 /Manage/Password 和 /Manage/EmailAddress,你不需要添加一个新的 MapRoute,默认的就可以了。只需使用 ManageController 作为控制器类名,使用“Password”和“EmailAddress”作为函数名:

class ManageController
{
    public ActionResult Password(...)
    { 
于 2013-07-05T22:39:47.960 回答