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;放; }
还是两者兼而有之?
或者我完全错了,我必须做其他事情?正如我所说,我无法测试这些软件,因为必须将软件送去进行测试,否则我会尝试各种方法。
最佳答案
根据评论总结我们的讨论。
- 创建一个 View 模型,该模型仅对满足相应 View 所需的信息建模。
- 从您的域 ef 模型在您的 Controller 操作中填充 View 模型
- 使用 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/