【问题标题】:MVC 3 using the same model in two similar views with non-nullable typesMVC 3 在两个具有不可空类型的相似视图中使用相同的模型
【发布时间】:2011-09-21 05:32:42
【问题描述】:

我在两个相似的视图上使用相同的模型。一个是用户配置文件视图,另一个是同一页面的管理员视图。管理员视图使用了用户配置文件视图所没有的更多标志。使用不可为空的类型时会出现问题。 IE。如果我们不使用模型中的布尔值,当模型在“提交”后被回发到控制器时,该布尔值将默认为 false 而不是 null,如果我们持久化模型,则会导致错误数据。

除了有两个极其相似的模型之外,MVC 3 处理这个问题的正确方法是什么?

谢谢!

【问题讨论】:

    标签: asp.net-mvc-3 asp.net-mvc-views


    【解决方案1】:

    据我了解,您想知道如何识别表单上的标志。

    为您的页面添加每个复选框的隐藏元素,这将表明复选框的存在。

    除了有两个极其相似的模型之外,什么是 MVC 3 处理这个问题的正确方法?

    你应该创建局部视图。

    添加

    关于其他建议,最好和最安全的方法是检查(在接收操作中)当前用户可以更改哪些标志(他的权利),而不是在基础中更改它。

    【讨论】:

      【解决方案2】:

      如果我理解正确,您必须在模型中实现可为空的 bool 并采取相应措施来处理它们。

      查看this answer 以获得类似的问题。您会发现一些可能有帮助的链接

      【讨论】:

      • 在此链接中仅关于将 (bool) 转换为 (bool?),但不从页面返回 NULL。从页面返回 NULL 在物理上是不可能的(因为 bool 是值类型)。怎么样(布尔?)它也是结构。
      【解决方案3】:

      您应该注意过度发布的风险。听起来管理员视图有某种方式授予角色或权限,而配置文件视图没有通过一组复选框。聪明的用户可能会弄​​清楚要设置哪些字段来赋予自己不应该拥有的角色或特权。如果您有一个操作来处​​理来自两个视图的表单数据,则无法判断这是否发生了。

      最简单的解决方案(如果您不想制作多个视图模型)是将表单发布回不同的控制器操作。管理员级别的操作将使用布尔值来更新模型,其他操作不会。这可以防止任何过度发布的风险。 向视图添加隐藏字段将不会给您带来任何安全性;不要相信您从浏览器获得的数据。从不。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        • 1970-01-01
        相关资源
        最近更新 更多