Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET MVC-集合属性应为只读。通过删除该属性,将其更改为只读_C#_Asp.net Mvc_Code Analysis - Fatal编程技术网

C# .NET MVC-集合属性应为只读。通过删除该属性,将其更改为只读

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); } 这是视图

我有一个使用两个类的控制器。一个称为IndexModel,另一个称为IndexViewModel。 我将IndexViewModel传递给IndexModel构造函数

[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>