[英]Is it good to define properties of “Model” type in ViewModel, ASP.net MVC
我已經閱讀了幾篇關於在ASP.net MVC中使用ViewModel的文章,並意識到它與MV-VM模式中的“ ViewModel”不同。
使用ViewModel是為了避免直接從View訪問模型,但是在ViewModel中具有類型屬性(在模型層定義)是一種好方法嗎? 這意味着最終我們需要將模型名稱空間包括到ViewModel中。
例如
模型
1. YesNoTBDValue實體/ POCO類
public partial class YesNoTBDValue
{
public int Id { get; set; }
public string Name { get; set; }
}
2 項目實體中使用的YesNoTBDValue類(在模型本身中定義)
public partial class Project
{
public virtual YesNoTBDValue IsAvailable { get; set; }
}
查看模型
1. ProjectEditViewModel
public class ProjectEditViewModel
{
HERE TO INCLUDE YesNoTBDValue CLASS, I NEED TO INCLUDE MODELS
OR THERE IS BETTER WAY?
public List<YesNoTBDValue> YesNoTBDValues { get; set; }
public int IsAvailableSelectedItemId { get; set; }
}
調節器
項目控制器(在編輯操作中創建視圖模型的新實例)
ProjectEditViewModel projectEditViewModel = new ProjectEditViewModel
{
YesNoTBDValues = db.YesNoTBDValues.ToList()
};
視圖
顯示YesNoTBDValues列表中的DropDownList並將所選項目保留在IsAvailableSelectedItemId中
@Html.DropDownList("IsAvailableSelectedItemId ",
new SelectList(Model.YesNoTBDValues, "Id", "Name",
Model.IsAvailableSelectedItemId ))
請建議我應該如何正確編碼。
重復的問題:ViewModel是否應包含Model的名稱空間? 在我的示例中,在模型中定義了YesNoTBDValue ,要使用它,我正在使用模型的名稱空間
/ 另一種方法 /
我對現有方法不滿意,因此從github下載了Microsoft Nuget Gallery源代碼,並意識到他們從未在VIEWMODEL內使用過MODELS,這對我來說很有意義。 我對上面的代碼做了一些更改( 以便從ViewModel中刪除對Model的引用 ),並發現它工作得很好。
這是我的更改:
型號 不變,不變
查看模型
1.創建YesNoTBDValue類的副本,說YesNoTBDValueViewModel
public class YesNoTBDValueViewModel
{
public int Id { get; set; }
public string Name { get; set; }
}
2在ProjectEditViewModel中使用此ViewModel並刪除模型引用
public class ProjectEditViewModel
{
public List<YesNoTBDValueViewModel> YesNoTBDValues {get;set;}
public int IsAvailableSelectedItem {get;set;}
}
控制器更改以填充這些值的方式。 (在編輯操作中)
ProjectEditViewModel projectEditViewModel = new ProjectEditViewModel
{
YesNoTBDValues = db.YesNoTBDValues.Select(
x => new LMSPriorTool.ViewModels.YesNoTBDValueVM
{
Id = x.Id,
Name = x.Name
}).ToList()
}
經過這些更改后發現,它也可以正常工作。 我喜歡第二種方法,因為本模型和ViewModel完全相互分離 。 讓這個問題開放,以供進一步討論。
如果我在這里錯過了一些東西,請給我一些啟示。
我試圖保持ViewModel
只包含在視圖上下文中自然的簡單類型。 這樣,我將視圖中的渲染邏輯保持在最低限度並保持視圖整潔。
您的ViewModel可以非常簡單地表示為:
public class ProjectEditViewModel
{
public int YesNoTBDValueSelected { get; set; }
public SelectList YesNoTBDValueOptions { get; set; }
}
要么
public class ProjectEditViewModel
{
public int YesNoTBDValueSelected { get; set; }
public IEnumerable<SelectListItem> YesNoTBDValueOptions { get; set; }
}
現在,用於生成SelectList
邏輯進入您的Project
<-> ProjectEditViewModel
映射中,並且不包含在View
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.