在ASP.NET MVC中POST后消息反馈的最佳实践

时间:2013-01-25 18:11:25

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

我想在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类有一个消息属性

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

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

所以,doult是解决这种情况的最佳方法是什么?

我读过一些推荐TempData的文章,其他人推荐使用ViewData,将邮件传输到Index View。

2 个答案:

答案 0 :(得分:6)

让我分享一下我开发的一个项目的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。

答案 1 :(得分: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)
}