2011-07-25 47 views
2

我有一个关于ASP .Net MVC的问题。 我在我的母版页(工具栏)中有一个电子邮件注册表单,它有一个电子邮件的文本字段和一个将电子邮件发送到我的家庭控制器的按钮。持续控制器之间的错误

我遇到的问题是,如果我导航到不同控制器中的页面,并且我单击提交以提交我的电子邮件,并且如果该电子邮件有错误,则向ModelState.Errors添加一个错误,然后重定向到原始页面(我的表单中的隐藏字段中有原始页面,所以我知道重定向的位置),因为您可能已经注意到错误会丢失,因为在另一个控制器中我们有一个完全不同的ModelState。

如果没有错误,电子邮件将被保存,用户将成功发送到完成的页面。

我首先想到的是我可以将错误保存在TempData中,然后检查它是否在动作文件管理器或基本控制器类中的某处具有值,并将其添加到新的控制器模型状态。

我想知道是否有任何其他方式或更好的方法,或者即使在TempData中发送错误是一个很好的做法。

谢谢。

回答

1

一个POST操作的通常模式是:

[HttpPost] 
public ActionResult Foo(MyModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     // if there were some validation errors redisplay the form so that 
     // the user can fix them 
     return View(model); 
    } 

    // At this stage we know that the model is valid => we may try do some 
    // processing on it: 
    if (!Repository.TryDoSomeProcessing(model)) 
    { 
     // Something wen wrong with our processing => redisplay the form 
     // to inform the user of this 
     ModelState.AddModelError("foo", "bar"); 
     return View(model); 
    } 

    // at this stage we know that the processing succeeded => we may redirect 
    // there will no longer be error messages. We could at maximum use TempData 
    // to store some success message: 
    TempData["message"] = "Thank you for submitting!"; 
    return RedirectToAction("Success"); 
} 

当然,如果你违反了这个模式,并想坚持错误重定向,等等......你是你自己。我看到人们在使用TempData,Sessions,Cache ......来纠正重定向之间的持续性错误。我宁愿留下这些技术而没有评论。

+0

谢谢,我应该使用Ajax并保存麻烦! – Raha

+0

@Raha,是的,AJAX可以节省很多麻烦。 –

0

我已经使用TempData在重定向之间保存ModelState,并且绝对推荐它!

MvcContrib项目有一个很好的帮手,可以很容易地使用Action过滤器将ModelState保存和恢复到TempData。

然而,对于我们的项目,我们想手动控制,所以我们创建的扩展方法TempData这样我们就可以使用下面的代码:

TempData.SaveModelState(ModelState); 
return Redirect...; 

,并恢复:

TempData.RestoreModelState(ModelState); 

这样,我们的网站从不呈现来自无效POST的视图,它总是重定向到GET。