.NET MVC - 集合属性应为只读通过删除 属性 更改为只读

.NET MVC - Collection properties should be read only Change to be read-only by removing the property

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

[HttpGet]
public ActionResult Index()
{
    var model = new IndexModel(new IndexViewModel());
    var vm = model.GetViewModel();
    return View("Index", vm);
}

这是视图模型class。请注意 setter 是私有的。

public class IndexViewModel
{
    public IList<SelectListItem> SelectListItems { get; private set; }
    public IndexViewModel()
    {
        this.SelectListItems = new List<SelectListItem>();
    }
}

这是模型。当 GetViewModel 被调用时,SelectListItems 列表被填充并且视图模型 returned.

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())来更改集合数据并且 return 没有结果是不是不好的做法?

我应该制作 setter public 以便我可以 return 我的方法中的列表并以这种方式设置视图模型 属性 吗?

将其设为私有有什么好处?头疼。。。搞定public :)

在其他视图模型中使用视图模型没有任何问题...想象一下有一个博客 post...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; }
}

现在,当您在 PostsController 上渲染 Posts/{id} 视图时,将渲染视图 Posts/Index.cshtml,并且您的评论可以在局部视图中呈现...

// Take this as pseudo code as there's some syntatic errors (can't be asked to open VS)
@for(int i = ... i < Model.Comments.Length... i++){
    this.Html.Partial("_CommentsPartial.cshtml, Model.Comments[i])
}

另一方面,如果您愿意,您也可以将模型作为 JSON 对象传递给视图,而无需使用这个巧妙的小技巧...在您的控制器操作中...

this.ViewBag.Json = JsonConvert.SerializeObject<TViewModel>(viewModel);

在您看来,只需选择备份...

<script> var json = @this.ViewBag.Json </script>

希望这对这些视图模型服务的目的提供了一些见解...