2016-11-30 34 views
2

有此資源的負荷在谷歌,但我不能完全明白,我需要在我的情況做:ASP.NET MVC錯誤的做法:可選子模型有了必選屬性

我有這個類:

public class CompanyLanguage : EntityBase 
{ 
    public int CompanyId { get; set; } 
    public int LanguageId { get; set; } 
    public bool IsDefault { get; set; } 


    public virtual Company Company { get; set; } 
    public virtual Language Language { get; set; } 
} 

Language被定義爲:

public class Language:EntityBase 
{ 
    [Required] 
    [DisplayName("Language Code")] 
    public string LanguageCode { get; set; } 

    [Required] 
    [MaxLength(2, ErrorMessage ="2 characters maximum")] 
    [DisplayName("2 Char Language Code")] 
    public string LanguageCode2Char { get; set; } 

    [Required] 
    [DisplayName("Language Name")] 
    public string LanguageName { get; set; } 

    public virtual List<LabelLanguage> LabelLanguages { get; set; } 
} 

運行Fortify Scan回報問題下面爲高優先級:

(ASP.NET MVC錯誤的做法:可選子模型有了必選屬性)

我們不能運行設防掃描 - 它是被別人跑,所以我需要改變這樣的權利它不會直接返回。

我看過的所有資源都表明可以進行底層攻擊 - 即無效Language,儘管Language具有一些必需的屬性。

對我來說,這是一個有效的場景 - Language所需的屬性只有在Language不爲空時才需要。

那麼我該怎麼做才能解決這個問題呢?我需要public int LanguageId { get; set; },還是public virtual Language Language { get; set; }或兩者兼而有之?

還是我完全錯了,我還得做點別的?正如我所說的,我不能測試這些軟件,因爲軟件必須被送去參加測試,否則我會嘗試一切。

+0

所以你直接發送這個ef實體到沒有視圖模型的視圖? – Fran

+0

我是 - 我讀過,我真的應該使用視圖模型,但我的視圖模型將像字面上完全一樣,似乎我增加了很多代碼和維護沒有多少獎勵。你怎麼看? – Rick

+2

以及獎勵是關注和更清晰的代碼分離。由於您正在向視圖發送多對多連接實體,因此您可能不需要所有這些信息。很高興看到視圖和控制器操作來查看你在做什麼,但我猜測你已經有了公司和語言的下拉菜單。如果是這種情況,則需要返回到視圖的唯一方法是列出每個下拉列表的Id和說明,而不是完整的ef實體。 – Fran

回答

3

總結我們從評論的討論。

  1. 創建視圖模型,該視圖模型僅建模滿足相應視圖所需的信息。
  2. 從您的域中填充控制器操作中的視圖模型,例如,模型
  3. 或者使用linq查詢或Automapper將項目直接導入視圖模型。

例視圖的提問模式

public class CompanyLanguageEditViewModel 
{ 
    [DisplayName("Company")] 
    [Required] 
    public int CompanyId { get; set; } 

    [DisplayName("Language")] 
    [Required] 
    public int LanguageId { get; set; } 
    public bool IsDefault { get; set; } 

    public IEnumerable<SelectListItem> Companies{ get; set; } 
    public IEnumerable<SelectListItem> Languages { get; set; } 
} 

而且在你看來,你就可以使用

@Html.DropDownListFor(x => x.CompanyId, Model.Companies); 

和您的標籤將是國家,你只打算回來後你需要

+0

絕對是我應該走的路!作爲一個快速解決方案,爲了解決這個問題,將會使'public virtual Language Language {get;組; }所需的財產工作?這有效嗎?正如我所說,我無法嘗試,因爲我沒有進行測試。時間很短,所有這些ViewModel變化將意味着不符合截止日期。 – Rick

+0

這是如何讓你繞開原來的問題?您仍然將ef模型傳遞給您的視圖。虛擬也是不必要的。該虛擬機如此可以返回代理對象進行延遲加載。我相當肯定,如果您將語言標記爲必填項,則在發佈 – Fran

+0

時將需要所需的所有語言屬性。原始問題是子模型(語言)需要屬性,即使語言在CompanyLanguage中是可選的。所以我會假設製作語言是必需的,會解決問題嗎? – Rick