最近,我一直致力于在我的项目中启用更多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<string>
自动属性违反了规则CA2227。如果我没有进行模型绑定,我可以将属性设置为只读并在其他地方填充集合。但是,该方法不适用于默认模型绑定器。现在,我刚刚在视图模型中添加了抑制消息。
有没有办法可以在不违反CA2227的情况下绑定模型中的项目集合?或者在这里添加抑制消息是我最好的选择?
答案 0 :(得分:3)
我相信你需要创建一个自定义ModelBinder
来解决这个问题,这是不值得的。在这种情况下,因为打破规则有合理的好处继续并压制它。
答案 1 :(得分:1)
这是应该取消此规则的一种情况,因为这些模型类还可以作为传输数据对象执行工作。
引用规则文档:
何时禁止显示警告
如果该属性是数据传输对象(DTO)类的一部分,则可以禁止显示警告。
否则,请勿根据此规则禁止警告。
https://docs.microsoft.com/pt-br/visualstudio/code-quality/ca2227?view=vs-2019