C# .NET MVC-集合属性应为只读。通过删除该属性,将其更改为只读
我有一个使用两个类的控制器。一个称为IndexModel,另一个称为IndexViewModel。 我将IndexViewModel传递给IndexModel构造函数C# .NET MVC-集合属性应为只读。通过删除该属性,将其更改为只读,c#,asp.net-mvc,code-analysis,C#,Asp.net Mvc,Code Analysis,我有一个使用两个类的控制器。一个称为IndexModel,另一个称为IndexViewModel。 我将IndexViewModel传递给IndexModel构造函数 [HttpGet] public ActionResult Index() { var model = new IndexModel(new IndexViewModel()); var vm = model.GetViewModel(); return View("Index", vm); } 这是视图
[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>();
}
}
如果您能就目前的结构提出任何意见,我将不胜感激,但我的主要问题是:
编写一系列方法(如FillSelectListItems())来更改收集数据而不返回结果,这是一种糟糕的做法吗
我是否应该将setter设置为公共的,这样我就可以从我的方法返回一个列表,并以这种方式设置视图模型属性?将其设置为私有,您有什么好处?头痛。。。公开:) 在其他视图模型中使用视图模型没有任何问题。。。想象一下有一篇博文。。。BlogPostViewModel。。。你希望它也有评论,对吗?BlogPostViewModel>CommentViewModel
public class BlogPostViewModel
{
public string BlogPostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public List<CommentViewModel> Comments { get; set; }
}
另一方面,如果您愿意,您也可以将您的模型作为JSON对象传递给视图,而无需使用这个简洁的小技巧。。。在控制器操作中
this.ViewBag.Json = JsonConvert.SerializeObject<TViewModel>(viewModel);
this.ViewBag.Json=JsonConvert.SerializeObject(viewModel);
在你看来,只要选择备份
<script> var json = @this.ViewBag.Json </script>
var json=@this.ViewBag.json
希望这提供了一些关于这些视图模型的用途的见解…我认为最好保持setter私有的原因是因为代码分析警告:
集合属性应为只读通过删除属性将“IndexViewModel.SelectListItems”更改为只读setter.
虽然公开收藏似乎对我没有其他负面影响,所以我想我可以忽略这里的警告。谢谢之所以这么说是因为你没有从更高的范围访问属性。。。一旦你这样做,警告就会消失。对代码进行分析是很好的,因为它可以帮助您保持代码的整洁,但它会假定您当前的代码状态为最终状态,并基于此为您提供建议。
this.ViewBag.Json = JsonConvert.SerializeObject<TViewModel>(viewModel);
<script> var json = @this.ViewBag.Json </script>