Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC错误实践:具有必需属性的可选子模型_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

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;}
设为必需,还是两者都设为必需


还是我完全错了,我必须做点别的?正如我所说,我无法测试这些,因为软件必须被送走进行测试,否则我将尝试各种方法。

从评论中总结我们的讨论

  • 创建一个视图模型,该模型仅对满足相应视图所需的信息进行建模
  • 从域ef模型填充控制器操作中的视图模型
  • 使用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; }
    }
    

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

    ,因此您直接将此ef实体发送到没有视图模型的视图?我是-我已经读到,我真的应该使用视图模型,但我的视图模型将与实体完全相同,这似乎是我添加了更多代码和维修费不多。你认为呢?好吧,回报是分离关注点和更干净的代码。由于要向视图发送多对多联接实体,因此可能不需要所有这些信息。如果能看到视图和控制器的操作来了解您正在做什么,那将是一件非常棒的事情,但是我猜您已经有了公司和语言的下拉列表。如果是这种情况,唯一需要返回视图的是每个下拉列表的Id和描述列表,而不是完整的ef实体。是的,我认为视图模型是最好的方法,因为它们在视图中建模信息。该视图仅要求某人选择一个语言和/或公司。他们并不是在创建一家在ef模型上进行验证的公司。是的,这需要重构成本。然后,您可以在控制器操作中将视图模型和ef模型结合起来,甚至可以使用linq查询直接投影到视图模型中。在他们被送到观景台之前。这里有一个很好的解释,这绝对是我应该走的路!作为一个快速解决方案,要解决这个问题,将
    公共虚拟语言{get;set;}
    作为必需的属性是否可行?这有效吗?正如我所说,我不能尝试,因为我没有执行测试。时间很短,进行所有这些ViewModel更改将意味着无法在截止日期前完成。这将如何解决您最初的问题?您仍在向视图传递ef模型。此外,虚拟环境是不必要的。该虚拟对象是这样的,ef可以返回一个代理对象进行延迟加载。我很确定,如果你把语言标记为required,当你发布原始问题时,语言的所有属性都是必需的,子模型(语言)有必需的属性,即使语言在公司语言中是可选的。所以我假设将语言设置为必需的,这样可以解决问题吗?那么,如果这些语言属性是必需的,您是否将所有语言属性都放在隐藏字段中,并将它们发回?模型绑定器不会仍然抛出验证错误,因为您实际上没有发回LanguageCode或LanguageCode2Char吗?谢谢,我正在进行重构,这是一个更好的解决方案。
    @Html.DropDownListFor(x => x.CompanyId, Model.Companies);