【问题标题】:How to display invalid call exceptions from fluent controller in MVCContrib?如何在 MVCContrib 中显示来自流利控制器的无效调用异常?
【发布时间】:2010-05-05 13:25:53
【问题描述】:

如何传递 MVCContrib.FluentController CheckValidCall(action) 中的操作引发的异常?

    [ExportModelStateToTempData]
    public ActionResult Index(int itemId, int page)
    {
        return CheckValidCall(() => MyService.GetResults(itemId, page))
            .Valid(x => View(x))
            .Invalid(() => RedirectToAction(RestfulAction.Index));
    } 

当 GetResults() 抛出异常时,我想在视图中显示它。我已经厌倦了 ModelState

    <%if (ViewData.ModelState.ContainsKey("_FORM")) {%>
    <div class="notificationError">
        <%= ViewData.ModelState["_FORM"].Errors.FirstOrDefault().ErrorMessage %>            
    </div>
<%}%>

但是 ModelState 是有效的并且不包含错误。有没有办法在不将服务方法包装在 try-catch 块中的情况下访问异常消息?如果这有帮助,我的单元测试是检查 ModelState 失败,因为 TestController.ModelState.IsValid 为真:

    [Fact]
    public void ServiceExceptionIsConvertedToModelStateErrorInFluentController()
    {
        // Set up
        MockService.Setup(x => x.GetResults(It.IsAny<int>(), It.IsAny<int>()))
            .Throws(new InvalidOperationException("Mocked Service Exception"));

        // Excercise
        Assert.Throws<InvalidOperationException>(() => TestController.GetResults(1, 1));

        // Verify
        Assert.False(TestController.ModelState.IsValid);
        Assert.True(TestController.ModelState["_FORM"].Errors.Count > 0);
    }

【问题讨论】:

    标签: model-view-controller exception-handling controller mvccontrib


    【解决方案1】:

    我已经设法通过覆盖 MvcContrib.FluentController.AbsteactFluentController.ExecuteCheckValidCall(Func action) 将异常传递给 ModelState:

        protected override object ExecuteCheckValidCall(Func<object> action)
        {
            try
            {
                return base.ExecuteCheckValidCall(action);
            }
            catch (Exception exception)
            {
                ModelState.AddModelError("_Exception", exception);
                return null;
            }
        }
    

    由 CheckValidCall 调用。然而,该方法被描述为“仅用于测试目的且不应使用”的替代方法是覆盖 MvcContrib.FluentController.AbstractFluentController.CheckValidCall()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      相关资源
      最近更新 更多