ASP.NET MVC不良做法:具有必需属性的可选子模型

时间:2016-11-30 15:10:12

标签: c# asp.net asp.net-mvc

Google上有大量资源,但我无法完全理解在我的方案中需要做什么:

我有这堂课:

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; }或两者兼而有之?

或者我完全错了,我还要做别的事吗?正如我所说,我无法测试这些,因为软件必须被送去测试,否则我会尝试各种各样的。

1 个答案:

答案 0 :(得分:4)

从评论中总结我们的讨论。

  1. 创建一个视图模型,该模型仅模拟满足相应视图所需的信息。
  2. 从域ef模型
  3. 中填充控制器操作中的视图模型
  4. 使用linq查询或Automapper直接投影到视图模型中。
  5. 您问题的示例视图模型

    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);
    

    并且您的标签将是国家/地区,您只需要回复所需内容