C# ASP.NET MVC中发布后邮件反馈的最佳实践

C# ASP.NET MVC中发布后邮件反馈的最佳实践,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我正试图找到一个好的方法来在发布后反馈信息 例如,我有这些方法 public ActionResult Index(int id) { Model model = getModel(id); return View(model); } [HttpPost] public ActionResult Save(Model model) { Result result = sav

我正试图找到一个好的方法来在发布后反馈信息

例如,我有这些方法

    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");
    }
结果类具有消息属性

        public class Result
        {
           ...
           public string Message{get;set;}
        }
所以,当我调用…/Controller/Index/1时,会显示我的索引视图,该视图有一个调用Save Action的提交按钮,但如果业务层出现问题,我会显示错误/警告消息

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


我读过一些文章,其中建议使用TempData,其他人建议使用ViewData,以便将消息传输到索引视图。

对于失败,您应该使用

ModelState.AddModelError("", "The error message");
因为它将被
Html.ValidationSummary(true)
(自动添加到所有视图中)自动拾取

对于通知,您可以使用
TempData
ViewBag

然而,我不鼓励你改变方向。相反,给用户一个纠正错误的机会(即使是业务层产生了错误)。使用类似于:

[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)
}

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

如果要在两个请求之间持久化数据,必须使用TempData。如果您正在重定向到另一个操作,ViewBag将不起作用…
TempData
对于重定向,ViewBag对于同一页面。