【问题标题】:Try Catch, ModelState.IsValid, or Both?试试 Catch、ModelState.IsValid 还是两者兼而有之?
【发布时间】:2015-08-19 01:28:47
【问题描述】:

我想知道,在基本 CRUD 操作中测试有效性和错误的最佳方法是什么?

当我第一次用来生成脚手架 MVC 控制器时,他们有这样的东西:

if (ModelState.IsValid)
{
    // do stuff
    return View("SuccessfulView")
}
// if we got this far something went wrong, redisplay
return View()

但现在我得到了这样的东西:

try
{
    // do stuff
    return RedirectToAction("SuccessfulView");
}
catch
{
    return View();
}

测试 ModelState 与测试异常不同,所以我很想把它们都放进去。

但后来我想知道为什么 MS 在更新脚手架代码时没有将两者都放入(毫无疑问,他们这样做是有原因的)。

另外,每一个基本动作都开始变得相当复杂:

if (ModelState.IsValid)
{
    try
    {
        // do stuff
        return RedirectToAction("SuccessfulView");
    }
    catch
    {
        return View();
    }
}
// if we got this far something went wrong, redisplay
return View()

【问题讨论】:

    标签: asp.net-mvc controller try-catch modelstate


    【解决方案1】:

    ModelState - 使用您将应用的数据注释验证您的 ViewModel。

    TryCatch - 将捕获代码中可能发生的任何异常。

    我说两者都有!

    就是这样,

    if (ModelState.IsValid)
    {
        try
        {
            // do stuff
            return View();
        }
        catch(Exception ex) // catches all exceptions
        {
            return View(ex.Message);
        }
    }
    ModelState.AddModelError("", "Error");
    return View(model);
    

    【讨论】:

    • 感谢 SHemmelburg。我很好奇为什么 MS 会从脚手架上放下一个来代替另一个,而他们默认情况下不会同时放入两个。这似乎是显而易见的选择,除非我遗漏了一些东西(这很可能)
    • @Martin Hansen Lennox,我同意,也许他们会在某个时候,但现在,只要我们知道如何实现这些功能,我认为我们会没事的。 :)
    【解决方案2】:

    我认为 MS 没有在脚手架中包含 try/catch 的原因是因为已经有其他机制来处理异常。有关 Asp.NET MVC 中可用的 6 个不同选项的列表,请参阅 this。 MS 可能不想规定特定的方法,而是打算让实施者自己选择一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 2010-10-20
      相关资源
      最近更新 更多