【问题标题】:Best practices to messages feedback after POST in ASP.NET MVCASP.NET MVC POST 后消息反馈的最佳实践
【发布时间】:2013-01-25 18:11:25
【问题描述】:

我正在努力寻找一种在 POST 后反馈消息的好方法。

例如,我有这些方法

    public ActionResult Index(int id)
    {
        Model model = getModel(id);           

        return View(model);
    }

    [HttpPost]
    public ActionResult Save(Model model)
    {

        Result result = saveModel(result)

        if (Result.Status != Status.SUCCESS)
        {
            ...
        }
        else if(Result.Status != Status.FAILURE)
        {
            ...
        }else
        {
            ...
        }
        return RedirectToAction("Index");
    }

Result 类有一个 message 属性

        public class Result
        {
           ...
           public string Message{get;set;}
        }

所以,当我调用 .../Controller/Index/1 时,会显示我的索引视图,并且该视图有一个调用保存操作的提交按钮,但如果业务层出现问题,我想显示错误/警告信息。

那么,问题是解决这种情况的最佳方法是什么?

我已经阅读了一些推荐 TempData 的文章,其他人推荐 ViewData,将消息传输到索引视图。

【问题讨论】:

  • 如果你想跨请求持久化数据,你必须使用TempData。如果您要重定向到另一个操作,ViewBag 将不起作用...
  • TempData 用于重定向,ViewBag 用于同一页面。

标签: c# asp.net-mvc-3


【解决方案1】:

让我分享一个我开发的一个项目的 ChangePassword 操作示例:

[HttpPost]
public ActionResult ChangePassword(LoginModel model)
{
    if (ModelState.IsValid && _userService.ChangePassword(model.Password, model.NewPassword))
        ViewBag.SuccessMessage = UI.PasswordChanged;
    else
        ModelState.AddModelError("Password", ErrorMessages.InvalidPassword);
    return View(model);
}

请记住,如果您重定向到另一个操作,ViewBag 将不起作用。如果您想在一个请求中保留信息,则必须使用 TempData。

【讨论】:

    【解决方案2】:

    对于失败你应该使用

    ModelState.AddModelError("", "The error message");
    

    因为它会被Html.ValidationSummary(true) 自动拾取(它会自动添加到所有视图中)

    对于通知,您可以使用TempDataViewBag

    但是,我不鼓励您重定向所有内容。而是让用户有机会更正任何错误(即使是业务层生成错误)。使用类似的东西:

    [HttpPost]
    public ActionResult Save(Model model)
    {
        if (!ModelState.IsValid)
            return View(model);
    
    
        Result result = saveModel(result)
        if (Result.Status == Status.SUCCESS)
            return RedirectToAction("Index");
    
        if (Result.Status != Status.FAILURE)
        {
            ModelState.AddModelError("", "Ooops, failed");
        }
        else
        {
            ModelState.AddModelError("", "Some other error");
        }
    
        return View(model)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多