【问题标题】:CA2227 and ASP.NET Model BindingCA2227 和 ASP.NET 模型绑定
【发布时间】:2013-08-30 17:19:38
【问题描述】:

最近,我一直致力于在我的项目中启用更多 Visual Studio 代码分析规则。但是,我一直碰到规则CA2227:“集合属性应该是只读的”。

假设我有一个这样的模型类:

public class Foo
{
    public string Name { get; set; }

    public List<string> Values { get; set; }
}

我有一个强映射视图页面:

@using (Html.BeginForm())
{
    @Html.LabelFor(m => m.Name)
    @Html.EditorFor(m => m.Name)
    for (int i = 0; i < Model.Values.Count; i++)
    {
        <br />
        @Html.LabelFor(m => Model.Values[i]);
        @Html.EditorFor(m => Model.Values[i]);
    }

    <button type="submit">Submit</button>
}

使用 ASP.NET MVC,我可以在我的控制器中编写一个动作,该动作会自动将此输入绑定到 Foo 类型的类:

[HttpPost]
public ActionResult ProcessForm(Foo model)
{
    return View(model);
}

这种方法的问题是我的List&lt;string&gt; auto 属性违反了规则 CA2227。如果我不进行模型绑定,我可以将属性设为只读并在其他地方填充集合。但是,该方法不适用于默认模型绑定器。现在,当它出现在视图模型中时,我刚刚添加了一条抑制消息。

有没有一种方法可以在不违反 CA2227 的情况下绑定模型中的项目集合?还是在这里添加禁止消息是我的最佳选择?

【问题讨论】:

  • 您是否尝试过在将 List 发送到您的视图之前对其进行初始化?

标签: c# asp.net asp.net-mvc code-analysis fxcop


【解决方案1】:

我相信您需要创建一个自定义 ModelBinder 来解决这个问题,这是不值得的。在这种情况下,因为违反规则有合理的好处,所以继续并禁止它。

【讨论】:

    【解决方案2】:

    这是应该禁止此规则的一种情况,因为这些模型类也作为传输数据对象执行工作。

    引用规则文档:

    何时禁止显示警告

    如果属性是数据传输对象 (DTO) 类的一部分,您可以禁止显示警告。
    否则,不要禁止来自该规则的警告。

    https://docs.microsoft.com/pt-br/visualstudio/code-quality/ca2227?view=vs-2019

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多