【问题标题】:How do I perform error handling in ASP.NET MVC 3 controller?如何在 ASP.NET MVC 3 控制器中执行错误处理?
【发布时间】:2012-02-07 12:48:28
【问题描述】:

我有一个帐户控制器,它具有:

  • Lo​​ginForm(获取操作)
  • 登录(发布操作)
  • RegisterForm(获取操作)
  • 注册(操作后)

在另一个控制器的索引操作中,我使用将它们呈现为:

  • Html.RenderAction("RegistrationForm", "Acount");
  • Html.RenderAction("LoginForm", "Acount");

一切正常,我可以注册新用户、登录并通过不显眼的验证进行验证。

问题是在注册/登录操作中进行一些后端验证时,如果出现错误,我不知道如何传递要呈现的错误。

我已经尝试过 PRG 模式,它工作正常。我得到了带有保留数据的表单上显示的错误,但 PRG 不是这样做的方法。

在不使用 ajax 验证或移动使用 RegistrationForm/LoginForms 的控制器中的这些方法的情况下,有什么替代解决方案?

由于后台使用会话,我想跳过使用 TempData。

编辑代码示例:

class AccountController : SomeBaseController{

    [HttpGet]
    public PartialViewResult RegistrationForm()
    {
        return PartialView(new RegisterUser());
    }

    [HttpPost]
    public ActionResult RegisterUser(RegisterUser user)
    {
        if (ModelState.IsValid)
        {
            var _user;// create domain user from Register user Model;

            var _validationOutput = _userService.DoSomeAwsomeServerSideValidation(_user);// do some custom validation

            if (_validationOutput.IsFault)
            {
                // we preseve tempdata in base controller OnActionExecuted
                _validationOutput.ErrorMessages.ForEach(x => ModelState.AddModelError(_validationOutput.ErrorCode, _validationOutput));
                // redirect to home controller custom error occured
                return RedirectToAction("Index", "Home", user);
            }

            return RedirectToAction("RegistrationInfo");
        }

        return RedirectToAction("SomeUserInfoAction");
    }

}

class HomeController : SomeBaseController {
 Index(){
    return View();
 }}

HomeControllerMarkup { 
    @{Html.RenderAction("RegistrationForm", "Acount");} 
    @{Html.RenderAction("LoginForm", "Acount");}
}

【问题讨论】:

  • 您是在谈论为已输入的信息显示验证错误,还是为需要在单独的错误页面上显示的错误消息?我问的原因是你说PRG不是通向它的方法吗?我们可以查看您的控制器操作以更好地理解这一点吗?
  • 不是一种方法,因为 PRG 是为了防止 x 表单发布,这不是这里的情况。

标签: asp.net-mvc-3 post-redirect-get


【解决方案1】:

您可以使用以下方法手动将错误添加到您的后控制器中的ModelState

ModelState.AddModelError("", @"You didn't perform task XYZ");

然后您应该能够返回视图并在验证摘要中显示错误:

@Html.ValidationSummary(false, "Login was unsuccessful because...")

【讨论】:

  • 我这样做了,但问题是我无法返回承载 RegisterForm 和 LoginForm 的视图,因为它位于另一个控制器中。如果我重定向到操作,那么我必须 prg 并使用我不想使用的 tempview。
猜你喜欢
  • 1970-01-01
  • 2011-08-25
  • 2010-11-24
  • 1970-01-01
  • 2016-11-06
  • 2010-11-13
  • 2013-06-07
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多