CA2227和ASP.NET模型绑定

Ale*_*Dba 5 c# asp.net asp.net-mvc code-analysis fxcop

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

说我有一个像这样的模型类:

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

    public List<string> Values { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个映射很深的视图页面:

@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>
}
Run Code Online (Sandbox Code Playgroud)

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

[HttpPost]
public ActionResult ProcessForm(Foo model)
{
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于,我的List<string>自动属性违反了规则CA2227。如果不进行模型绑定,则可以使该属性为只读,并在其他位置填充该集合。但是,该方法不适用于默认的模型绑定器。目前,我只是在视图模型中添加抑制消息。

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

STW*_*STW 5

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