【问题标题】:Editing only a partial model in ASP.Net MVC在 ASP.Net MVC 中仅编辑部分模型
【发布时间】:2012-05-07 09:17:59
【问题描述】:

我对 MVC 很陌生,偶然发现了一个问题。我用谷歌搜索了很多,但找不到解决方案。

我正在使用带有角色的 ASP.Net Membership。

假设我有一个带有属性的产品模型:

  • 姓名
  • 艺术没有
  • 类别

我怎样才能实现这一点,所以只允许不同的角色 cab 编辑对象的一部分? (例如,假设一个角色不能更改产品的类别。)

同一个模型可以有不同的视图,或者同一个对象可以有不同的模型吗?

如果我遗漏了一些属性,当我保存它们时它们将具有 NULL 值。 我尝试使用@HTML.HiddenFor(...),但这些字段的验证失败。

【问题讨论】:

    标签: asp.net-mvc razor


    【解决方案1】:

    ViewModel 听起来可以解决问题。对于除了最琐碎的场景之外的所有场景,当您将模型和视图紧密耦合时,您都会遇到问题。

    如果您以前没有使用过它们,ViewModel 只是您正在渲染的特定视图的一个类(模型)。您可以在 ViewModel 上自定义所需的属性和验证,然后将其绑定到 Model,因此该结构更加灵活且易于使用。

    ViewModelshttp://kazimanzurrashid.com/posts/asp-dot-net-mvc-viewmodel-usage-and-pick-your-best-pattern有详细介绍

    编辑

    然后,您可以为每个角色创建一个 ViewModel,但如果您只是希望保护某个属性不被某些角色更新,则应该有其他解决方案,例如将 html 输入设置为禁用,然后在服务器上进行测试类别值仍处于其原始状态(请注意,您应该始终执行这样的测试,因为 Post 请求可以更改)。

    【讨论】:

    • 我要对柔道说同样的感谢。你应该有两个不同的 ViewModel。
    • 谢谢。我终于得到了这个工作。我使用 AutoMapper 从 Model 转换为 ViewModel。不过还是有一个问题。假设在其中一个 ViewModel 中我没有“名称”属性 - 当我在 Post 上恢复模型时,这将为空。我是否必须将 Name 作为属性之一并使用 Hiddenfor-field 或者是否有更好的方法;只更新 ViewModel 类中声明的字段?
    • 如果您不需要该属性,尤其是如果您不想修改它,则应将其从 ViewModel 中排除,并且不要放入隐藏字段,因为这可以在 Post 请求中被篡改。大多数像 Automapper 这样的映射工具应该能够处理这个问题,但如果没有,您将需要在服务器上手动处理。
    • 首先,感谢您的帮助。现在最后几个问题: - 假设我有两个用于同一个域对象的视图模型:Vm1 和 Vm2。我可以使用相同的发布方法来保存它们吗?如果是这样; how - 如何声明该方法?我应该有一个 Vm1 和 Vm2 继承自并去的 ViewModelBase:public ActionResult Edit(ViewModelBase model) {...}
    • - 当我保存它们时,我需要从存储库中获取域对象,更新当前视图模型中存在的域对象的属性。然后将域对象保存回存储库。有没有一种平滑的方法,或者我应该“手动”复制每个属性?视图模型应该知道这样做吗?
    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多