我有一个控制器使用两个类。一个叫IndexModel,另一个叫IndexViewModel。 我将IndexViewModel传递给IndexModel构造函数。.NET MVC - 集合属性应该是只读的通过删除属性更改为只读
[HttpGet]
public ActionResult Index()
{
var model = new IndexModel(new IndexViewModel());
var vm = model.GetViewModel();
return View("Index", vm);
}
这是视图模型类。注意setter是私人的。
public class IndexViewModel
{
public IList<SelectListItem> SelectListItems { get; private set; }
public IndexViewModel()
{
this.SelectListItems = new List<SelectListItem>();
}
}
这是模型。当调用GetViewModel时,将填充SelectListItems列表并返回视图模型。
public class IndexModel
{
private IndexViewModel vm;
public IndexModel(IndexViewModel IndexViewModel)
{
this.vm = IndexViewModel;
}
public IndexViewModel GetViewModel()
{
this.FillSelectListItems();
return vm;
}
private void FillSelectListItems()
{
// this data is pulled in from another class that queries a database...
var data = ...
foreach (var itm in data)
{
vm.SelectListItems.Add(new SelectListItem()
{
Value = itm.Id.ToString(),
Text = itm.Text,
});
}
}
}
我将不胜感激这是如何目前的结构有任何意见,但我的主要问题是:
它是不好的做法,写一堆的方法,如FillSelectListItems(),即改变收集数据和不要返回结果?
我应该让setter公开所以我可以从我的方法返回一个列表并设置视图模型属性的方式?
我想原因我认为最好保持setter私有是因为这个代码分析警告:'集合属性应该是只读的通过删除属性setter.Reset'IndexViewModel.SelectListItems'是只读的。尽管离开公共集合似乎没有其他消极的副作用所以我想我可以忽略这里的警告。谢谢! – ooXei1sh
之所以这样说,是因为你没有从梯子上方的范围访问属性......一旦你这样做了,那个警告就会消失。代码分析是很好的,因为它可以帮助您保持代码清洁,但它会假定您当前的代码状态为最终状态,并基于此提供建议。 –