.NET MVC - 集合属性应该是只读通过删除属性

时间:2016-01-31 15:31:50

标签: 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);
}

这是视图模型类。请注意,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所以我可以从我的方法返回一个列表并以这种方式设置视图模型属性吗?

1 个答案:

答案 0 :(得分:2)

通过将其设为私有,您必须获得什么?头疼......让它公开:)

在其他视图模型中使用视图模型没有任何问题...想象一下博客文章... BlogPostViewModel ...你会期望它也有评论吗? BlogPostViewModel&gt; 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; }
}

现在当您在PostsControllerPosts/{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])
}

另一方面,如果你愿意的话,你可以将你的Model作为一个JSON对象传递给视图,而不需要这个整洁的小黑客...在你的控制器动作......

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

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

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

希望这为这些View模型服务的目的提供了一些见解......