代码合同和ASP.Net验证器

时间:2011-09-30 08:11:48

标签: asp.net code-contracts

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

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

这样做的优点是可以按预期工作,但客户端会被大量的Contract.Assume大型项目声明。

有任何想法/建议吗?

1 个答案:

答案 0 :(得分:0)

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