【问题标题】:Code Contracts with new MVC 3 ViewBag新 MVC 3 ViewBag 的代码契约
【发布时间】:2011-07-04 13:24:07
【问题描述】:
    public class HomeController : Controller
{
    public ActionResult Index()
    {
        // Warning  19  CodeContracts: Possibly calling a method on a null reference 'Website.Controllers.HomeController.<Index>o__SiteContainer0.<>p__Site2.Target'    HomeController.cs

        if (ViewBag != null)
        {
            ViewBag.Message = "Be Immortal";
        }

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

绞尽脑汁想弄清楚如何在 MVC 3 中满足 ViewBag 的 [X] 隐式非 Null 义务。有没有人想出一种方法来使代码合同与新的动态 ViewBag 类型相匹配?

我希望能够将 ViewBag 作为 ViewBagSafe 等包装在基本控制器中。

我确实意识到这对项目来说并不是一个真正的问题,因为 ViewBag 永远不会为空,但我想保留代码合同,默认为空检查,以防我将来出现失误(并且仍然能够编译时没有警告,以便我可以轻松识别我自己的违反合同的编码)。

【问题讨论】:

  • 原因很清楚,ViewBag 是动态的。我没有答案,但寻找 CC+Dynamic 会比 CC+MVC 提供更多结果
  • 好主意。如果我找到解决方案,将改进我的谷歌搜索并肯定会发布。现在,我不得不关闭 DBC 属性页上的 Null 检查。如果代码契约允许我们完全忽略动态类型,那就太好了。
  • 实际上 - 现在我记得这条评论“谢谢,是的,我们需要做一些工作来识别这种模式,或者隐含地与这些辅助字段/方法签订一些合同。”所以不让我发布链接,但你当然可以谷歌该声明......该死。谢谢 Henk,答案是……目前还没有答案,但如果 CC 更新提供了解决方案,它将保持开放状态。

标签: asp.net-mvc-3 razor code-contracts microsoft-contracts


【解决方案1】:

我找到了问题所在。它与动态成员查找的初始化逻辑和 C# 编译器发出的静态缓存字段有关。我不得不向 cccheck 教授这些内容,并向 System.Core.dll 中的缓存类添加一些协定。下一个版本不应再对动态访问成员发出这些警告。感谢您提出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    相关资源
    最近更新 更多