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

Per*_*rcy 4 c# asp.net 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; }
}
Run Code Online (Sandbox Code Playgroud)

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; }
}
Run Code Online (Sandbox Code Playgroud)

运行Fortify 扫描会将以下问题作为高优先级返回:

(ASP.NET MVC 不良实践:具有必需属性的可选子模型)

我们无法运行强化扫描 - 它正在由其他人运行,所以我需要正确进行更改,这样它就不会直接返回。

我查看过的所有资源都表明可以进行底层攻击 - 即 null Language,即使Language具有一些必需的属性。

Language对我来说,这是一个有效的场景 -仅当不为空时才需要的必需属性Language

那么我应该怎么做才能解决这个问题呢?我是否要求public int LanguageId { get; set; },或public virtual Language Language { get; set; }两者兼而有之?

或者我完全错了,我必须做别的事情?正如我所说,我无法测试这些,因为必须将软件发送出去进行测试,否则我会尝试各种方法。

Fra*_*ran 6

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

  1. 创建一个视图模型,仅对满足相应视图所需的信息进行建模。
  2. 从域 ef 模型在控制器操作中填充视图模型
  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; }
}
Run Code Online (Sandbox Code Playgroud)

在你看来你可以使用

@Html.DropDownListFor(x => x.CompanyId, Model.Companies);
Run Code Online (Sandbox Code Playgroud)

你的标签将是国家/地区,你只需回发你需要的内容