ViewModel类VS在域类上定义Exclude Bind列表

时间:2014-02-06 14:34:17

标签: asp.net asp.net-mvc asp.net-mvc-4 mvvm viewmodel

我有一个名为Server的模型类,它包含许多导航属性和属性,我想阻止用户绑定它。所以我找到了两种方法来避免过度发布攻击。

第一种方法是转到每个模型类并定义一个Exclude Bind列表,其中包含不应由用户绑定的所有属性和导航属性,如下所示: -

[MetadataType(typeof(TMSServer_Validation))]

 [Bind(Exclude = "Technology,IT360SiteID, VirtualMachines, TMSServer1,DataCenter,OperatingSystem,Rack,ServerModel,TechnologyBackUpStatu,TechnologyRole,TechnologyStatu ")]
    public partial class Server     {

    }
}

第二种方法是创建一个视图模型类,只有用户可以修改的属性如下: -

public class ServerViewModel
{
     public int ServerSize { get; set; }
   [Required]    
   public String OperatingSystem { get; set; }
   public String Commnet { get; set; }


}

我发现第一种方法实现起来更快,因为我只需要定义Exclude列表,而第二种方法需要我为每个域类创建视图模型类。那么建议使用哪种方法,为什么? 感谢

3 个答案:

答案 0 :(得分:1)

在没有看到其余代码的情况下很难判断,但总的来说,我认为使用ViewModel可能是一种更好的方法,原因如下:

  • 您将视图与业务逻辑分开
  • 更安全。如果将来某人在Server上添加了一个属性并忘记了绑定排除,那么在不知情的情况下,您会遇到过度绑定。如果您使用ViewModel方法,则必须明确添加新属性

答案 1 :(得分:1)

由于默认模型绑定器不知道您实际包含在表单中的哪些字段,因此会发生过度发布。 它将尝试将请求中的所有值映射到object。攻击者可以使用您的表单添加其他字段 查询字符串/表单发布数据并添加属性作为请求的一部分。默认型号粘合剂不会出现 知道区别。映射完成并处理更新后,您的Server类将停用。 要防止过度发布,请将注释设置为包含绑定中的字段,或者创建您在代码中提到的ViewModel。

  

建议使用哪种方法,为什么?

注释和ViewModel都只允许绑定指定的字段,但是当您使用ViewModel时,您将不会绑定业务对象或实体,并且您只有可用于预期输入的属性。 验证模型后,您可以将值从输入模型移动到下一层中使用的对象。

ķ。 Soctt Allen有一篇关于哪种方法更好的文章,您可以通过以下链接查看:

http://odetocode.com/blogs/scott/archive/2012/03/11/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx

答案 2 :(得分:0)

也许这个问题有点含糊不清,因为答案将基于意见或其他事情。但我会尽力回答它,而且确实是我的意见。所以这就是我看到它的方式:

  • 第一种方法 绑定属性 ):实施起来更快,因为您只需要在您的类上添加名称您不希望公开的属性,但是当您希望类为一个要素排除某些属性以及其他要素的其他属性时出现问题,并且您无法添加字段,有时在MVC中,视图需要更多字段那些由模型类提供的,然后你将需要使用ViewBag或其他东西。 这种方法对于快速和小型项目非常方便,但我仍然不喜欢使用ViewBag(出于美学原因)

  • 第二种方法 ViewModels ):更多的工作,更多的时间,但最后(在我看来)你得到一个更干净和有序的代码,你不需要使用ViewBag,因为你可以根据这个View所需的内容将完美的对象发送到视图,所以如果你有一个具有不同视图的对象,那么再次依赖根据需要,他们可以共享相同的ViewModel,也可以为每个ViewModel创建一个ViewModel。 如果您有解决方案或大型网络项目,这种方法可以非常方便地保留有序代码。

让我知道。