我在两个相似的视图上使用相同的模型。一个是用户配置文件视图,另一个是同一页面的管理员视图。管理员视图使用了用户配置文件视图所没有的更多标志。使用不可为空的类型时会出现问题。IE。如果我们不使用模型中的布尔值,当模型在“提交”后被发送回控制器时,该布尔值将默认为 false 而不是 null,如果我们持久化模型,则会导致错误数据。
除了有两个极其相似的模型之外,MVC 3 处理这个问题的正确方法是什么?
谢谢!
我在两个相似的视图上使用相同的模型。一个是用户配置文件视图,另一个是同一页面的管理员视图。管理员视图使用了用户配置文件视图所没有的更多标志。使用不可为空的类型时会出现问题。IE。如果我们不使用模型中的布尔值,当模型在“提交”后被发送回控制器时,该布尔值将默认为 false 而不是 null,如果我们持久化模型,则会导致错误数据。
除了有两个极其相似的模型之外,MVC 3 处理这个问题的正确方法是什么?
谢谢!
据我了解,您想知道如何识别表单上的标志。
将每个复选框的隐藏元素添加到您的页面,这将表明复选框的存在。
除了有两个极其相似的模型之外,MVC 3 处理这个问题的正确方法是什么?
您应该创建局部视图。
添加
关于其他建议,最好和最安全的方法是检查(在接收操作中)当前用户可以更改哪些标志(他的权利),而不是在基础中更改它。
如果我理解正确,您必须在模型中实现可为空的 bool 并采取相应措施来处理它们。
查看此答案以获取类似的问题。您会发现一些可能有帮助的链接
您应该注意过度发布的风险。听起来管理员视图有某种方式授予角色或权限,而配置文件视图没有通过一组复选框。聪明的用户可能会弄清楚要设置哪些字段来赋予自己不应该拥有的角色或特权。如果您有一个操作来处理来自两个视图的表单数据,则无法判断这是否发生了。
最简单的解决方案(如果您不想制作多个视图模型)是将表单发布回不同的控制器操作。管理员级别的操作将使用布尔值来更新模型,其他操作不会。这可以防止任何过度发布的风险。向视图添加隐藏字段将不会给您带来任何安全性;不要相信您从浏览器获得的数据。绝不。