我有这些模特:
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);
}
我知道正确保留了模型属性,但是在视图的验证部分中没有出现任何错误。将票证提取到自己的视图时,它可以正常工作。
答案 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);
}