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; }
或两者兼而有之?
或者我完全错了,我还要做别的事吗?正如我所说,我无法测试这些,因为软件必须被送去测试,否则我会尝试各种各样的。
答案 0 :(得分:4)
从评论中总结我们的讨论。
您问题的示例视图模型
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);
并且您的标签将是国家/地区,您只需要回复所需内容