C# ASP.NET MVC错误实践:具有必需属性的可选子模型
谷歌上有大量的资源用于此,但我无法完全理解在我的场景中需要做什么: 我有这门课:C# ASP.NET MVC错误实践:具有必需属性的可选子模型,c#,asp.net,asp.net-mvc,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; se
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; }
}
公共类语言:EntityBase
{
[必需]
[显示名称(“语言代码”)]
公共字符串语言代码{get;set;}
[必需]
[MaxLength(2,ErrorMessage=“最多2个字符”)]
[显示名称(“2字符语言代码”)]
公共字符串语言CODE2CHAR{get;set;}
[必需]
[显示名称(“语言名称”)]
公共字符串LanguageName{get;set;}
公共虚拟列表标签语言{get;set;}
}
运行将以下问题作为高优先级返回:
(ASP.NET MVC错误实践:具有必需属性的可选子模型)
我们无法运行强化扫描-它正在由其他人运行,因此我需要正确地进行更改,以便它不会直接返回
我看过的所有资料都表明,可以进行隐藏攻击,即空语言
,即使语言
具有一些必需的属性
对我来说,这是一个有效的场景-只有当Language
不为空时,才需要Language
的必需属性
那我该怎么解决这个问题呢?我是将public int-LanguageId{get;set;}
设为必需,还是将public-virtual-Language{get;set;}
设为必需,还是两者都设为必需
还是我完全错了,我必须做点别的?正如我所说,我无法测试这些,因为软件必须被送走进行测试,否则我将尝试各种方法。从评论中总结我们的讨论
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; }
}
您的标签将是Country,您只需要回发您需要的内容,因此您直接将此ef实体发送到没有视图模型的视图?我是-我已经读到,我真的应该使用视图模型,但我的视图模型将与实体完全相同,这似乎是我添加了更多代码和维修费不多。你认为呢?好吧,回报是分离关注点和更干净的代码。由于要向视图发送多对多联接实体,因此可能不需要所有这些信息。如果能看到视图和控制器的操作来了解您正在做什么,那将是一件非常棒的事情,但是我猜您已经有了公司和语言的下拉列表。如果是这种情况,唯一需要返回视图的是每个下拉列表的Id和描述列表,而不是完整的ef实体。是的,我认为视图模型是最好的方法,因为它们在视图中建模信息。该视图仅要求某人选择一个语言和/或公司。他们并不是在创建一家在ef模型上进行验证的公司。是的,这需要重构成本。然后,您可以在控制器操作中将视图模型和ef模型结合起来,甚至可以使用linq查询直接投影到视图模型中。在他们被送到观景台之前。这里有一个很好的解释,这绝对是我应该走的路!作为一个快速解决方案,要解决这个问题,将
公共虚拟语言{get;set;}
作为必需的属性是否可行?这有效吗?正如我所说,我不能尝试,因为我没有执行测试。时间很短,进行所有这些ViewModel更改将意味着无法在截止日期前完成。这将如何解决您最初的问题?您仍在向视图传递ef模型。此外,虚拟环境是不必要的。该虚拟对象是这样的,ef可以返回一个代理对象进行延迟加载。我很确定,如果你把语言标记为required,当你发布原始问题时,语言的所有属性都是必需的,子模型(语言)有必需的属性,即使语言在公司语言中是可选的。所以我假设将语言设置为必需的,这样可以解决问题吗?那么,如果这些语言属性是必需的,您是否将所有语言属性都放在隐藏字段中,并将它们发回?模型绑定器不会仍然抛出验证错误,因为您实际上没有发回LanguageCode或LanguageCode2Char吗?谢谢,我正在进行重构,这是一个更好的解决方案。
@Html.DropDownListFor(x => x.CompanyId, Model.Companies);