c# - ASP.NET MVC 不良做法 : Optional Submodel With Required Property

标签 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; }
}

语言定义为:

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 Bad Practices: Optional Submodel With Required Property)

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

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

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

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

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

最佳答案

根据评论总结我们的讨论。

  1. 创建一个 View 模型,该模型仅对满足相应 View 所需的信息建模。
  2. 从您的域 ef 模型在您的 Controller 操作中填充 View 模型
  3. 使用 linq 查询或 Automapper 直接投影到 View 模型中。

您的问题的示例 View 模型

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

并且您的标签将是 Country,您将只回发您需要的内容

关于c# - ASP.NET MVC 不良做法 : Optional Submodel With Required Property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40891778/

相关文章:

css - Azure 上 Bootstrap Glyphicons 的不同字体样式

c# - 下拉 future 10 年

c# - MVVM动态添加元素到scrollview

c# - 如何在 C# 中使用 Tor 控制协议(protocol)?

c# - 获取我的应用程序的当前点网络版本

c# - 如何在 ASP.net MVC4 的 webgird 中绑定(bind) JSON 返回结果值

C# 根据相同的开始和结束时间合并日期

c# - 无尽的滚动asp.net

c# - 为什么 EF Core 更新无法更新已修改的列

c# - 是否可以在我的 aspx View 中使用 'using' 语句? (ASP.NET MVC)