试试 Catch、ModelState.IsValid 或两者?

Try Catch, ModelState.IsValid, or Both?

我想知道,测试基本 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()

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);

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