.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>
希望这对这些视图模型服务的目的提供了一些见解...
我有一个使用两个 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>
希望这对这些视图模型服务的目的提供了一些见解...