【问题标题】:Code contracts and ASP.Net Validators代码合同和 ASP.Net 验证器
【发布时间】:2011-09-30 08:11:48
【问题描述】:

想象一下我有一个有合同的方法:

public void Do(string value)
{
     Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(value));
     MyBusiness.Handle(value);
}

这个方法是从一个 asp.net 2.0 网站调用的,值是从一个文本框中获取的,强制的:

<asp:TextBox ID="txtValue" runat="server" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtValue" ErrorMessage="boom" />
<asp:Button ID="btnDo" OnClick="btnDo_Click" Text="Do" />

后面的代码很经典:

protected void btnDo_Click(object source, EventArgs e)
{
    Page.Validate();
    if(Page.IsValid)
    {
         Do(txtDo.Text);
    }
}

此代码正在运行,但会引发代码合同警告:Requires unproven (!string.IsNullOrEmpty(value)),这让我认为(尽管并不奇怪)静态检查器不够聪明,无法查看 Page.IsValid(这对于静态检查器拥有这样的智能)。

在这种情况下我有什么选择?

我看到的选项选项是帮助静态检查假设:

protected void btnDo_Click(object source, EventArgs e)
{
    Page.Validate();
    if(Page.IsValid)
    {
         Contract.Assume(!string.IsNullOrEmpty(value));
         Do(txtDo.Text);
    }
}

这具有按预期工作的优点,但是客户端被很多合同所干扰。假设大型项目。

有什么想法/建议吗?

【问题讨论】:

    标签: asp.net code-contracts


    【解决方案1】:

    我认为Contract.Assume() 是这里的正确选择。是的,它很吵,但我不知道有什么更好的方法不会使问题复杂化。

    【讨论】:

      猜你喜欢
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2014-02-03
      • 1970-01-01
      相关资源
      最近更新 更多