如果我从详细信息页面开始:
http:\\www.mysite.com\App\Detail
我有一个名为Update 的 Controller 操作,它通常会调用redirectToAction 返回详细信息 页面。但是我在验证中发现了一个错误,我需要在重定向之前返回(以避免丢失我所有的 ModelState)。这是我的 Controller 代码:
public override ActionResult Update(Application entity)
{
base.Update(entity);
if (!ModelState.IsValid)
{
return View("Detail", GetAppViewModel(entity.Id));
}
return RedirectToAction("Detail", new { id = entity.Id })
但现在我看到带有验证错误消息的 View (因为我正在使用 HTML.ValidationSummary() )但是 url 看起来像这样:
http:\\www.mysite.com\App\Update
我是否可以在不将 modelstate 放入某些临时变量的情况下避免更改 URL?这里是否有最佳实践,因为我看到的唯一示例是在调用 redirectToAction 之间将 ModelState 放入某些 tempdata 中。
最佳答案
从 ASP.NET MVC 2 开始,当 return View()
从另一种 Action 方法。
因此,推荐的解决方案和 ASP.NET MVC 中普遍接受的约定是有一个相应的、名称相似的操作方法,它只接受 HTTP POST
动词。因此,在您的情况下,使用另一个名为 Detail
的操作方法应该可以解决您在验证失败时使用不同 URL 的问题。
[HttpPost]
public ActionResult Detail(Application entity)
{
base.Update(entity);
if (ModelState.IsValid)
{
//Save the entity here
}
return View("Detail", new { id = entity.Id });
}
此解决方案符合 ASP.NET MVC 最佳实践,也避免了摆弄 modestate 和 tempdate。
此外,如果您还没有研究过此选项,那么 asp.net mvc 中的客户端验证 也可能提供一些关于您的 URL 问题的解决方案。我强调一些,因为当浏览器禁用 javascript 时,这种方法将不起作用。
因此,最好的解决方案是有一个名为 Detail
的操作方法,但只接受 HTTP POST
动词。
关于c# - 当我在 asp.net mvc Controller 操作中验证失败时,如何保留我的 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3289179/