簡體   English   中英

在ASP.net MVC的ViewModel中定義“模型”類型的屬性是否好

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM