模型状态错误不会在重定向中持续存在

时间:2014-08-03 02:26:36

标签: asp.net-mvc

我有这些模特:

public class TicketViewModel
{
    [Required]
    public string Title { get; set; }
    //...
}

public class UserProfileViewModel
{
    //Various properties
    public TicketViewModel Ticket { get; set; }
}

我有一个控制器操作,需要提交提单。 Index操作会向页面返回UserProfileViewModel对象(模型在部分视图中分割,分页在前端完成)。当我重定向到Index操作时,不保留ModelState:

[HttpPost]
public ActionResult SubmitTicket(TicketViewModel model)
{
    if(!ModelState.IsValid || !model.BooleanProperty)
    {
        ModelState.AddModelError("Invalid Ticket", "Your ticket was filled out incorrectly.");
        var userViewModel = GenerateUserViewModel();
        userViewModel.Ticket = model;
        TempData["UserProfile"] = userViewModel;
        return RedirectToAction("Index");
    }
   //...
}

public ActionResult Index()
{
    var model = (TempData["UserProfile"] as UserProfileViewModel) ?? GenerateUserViewModel();
    return View(model);
}

我知道正确保留了模型属性,但是在视图的验证部分中没有出现任何错误。将票证提取到自己的视图时,它可以正常工作。

2 个答案:

答案 0 :(得分:0)

绑定错误(以及使用AddModelError()方法添加的错误)会添加到Errors的{​​{1}}属性中,而不会添加到模型本身。如果您想将一些错误传递给另一个视图,一种方法是将消息添加到ModelState,然后使用TempData方法提取它们以在视图中显示。

它有点旧,但this blog提供了一个很好的解释

但是如果模型有错误,为什么不返回视图(而不是重定向到另一个视图),以便用户可以更正它们?

Index()

PS。您正在使用if (!ModelState.IsValid()) { return View(model); } // redirect if valid 将错误消息添加到名为AddModelError("Invalid Ticket", ...的属性中,该属性不存在(第一个参数是要将错误分配给的属性的名称)。

答案 1 :(得分:0)

Modelstate在重定向时失去了它的价值......所以这将解决您的问题:

[HttpPost]
public ActionResult SubmitTicket(TicketViewModel model)
{
var errormessage="";
if(!ModelState.IsValid || !model.BooleanProperty)
{
    //ModelState.AddModelError("Invalid Ticket", "Your ticket was filled out incorrectly.");
    errormessage = "Your ticket was filled out incorrectly.";
    var userViewModel = GenerateUserViewModel();
    userViewModel.Ticket = model;
    TempData["UserProfile"] = userViewModel;
    return RedirectToAction("Index",new{ msg = errormessage });
}
}

public ActionResult Index(string msg)
{
var model = (TempData["UserProfile"] as UserProfileViewModel) ?? GenerateUserViewModel();
if(!string.IsNullOrEmpty(msg)){
ModelState.AddModelError("Invalid Ticket", msg);
}
return View(model);
}

--------------- OR ---------------

您还可以使用TempData,因为它会在一个重定向上保留其值,如下所示:

[HttpPost]
public ActionResult SubmitTicket(TicketViewModel model)
{
if(!ModelState.IsValid || !model.BooleanProperty)
{
    //ModelState.AddModelError("Invalid Ticket", "Your ticket was filled out incorrectly.");
    TempData["InvalidTicket"]="Your ticket was filled out incorrectly.";
    var userViewModel = GenerateUserViewModel();
    userViewModel.Ticket = model;
    TempData["UserProfile"] = userViewModel;
    return RedirectToAction("Index");
}
}

public ActionResult Index()
{
var model = (TempData["UserProfile"] as UserProfileViewModel) ?? GenerateUserViewModel();
ModelState.AddModelError("Invalid Ticket", TempData["InvalidTicket"].ToString());
return View(model);
}