【问题标题】:MVC 4 Creating Model With Data Passed from View to ControllerMVC 4 使用从视图传递到控制器的数据创建模型
【发布时间】:2013-06-18 19:17:32
【问题描述】:

我是 MVC 新手,我有一个相对基本的问题。我通过搜索找到了一些答案,但没有什么能让我觉得我知道这个常见功能的“最佳实践”:

我有强类型视图,并且在“成员”和“宠物”之间存在关系。我想在我的成员编辑视图中创建一个页面来“创建新宠物”。

此时,我想将 MemberId 从 Member 编辑视图传递到 Pet 创建页面,以便它可以启动 Pet 模型的新实例,并关联正确的成员。

我认为最佳做法是从成员编辑视图传递 memberId(但通过什么方法?),然后将此值存储在一个隐藏的表单字段中,该字段是强类型“memberId”值的正确名称在宠物模型上。然后,Pet 创建控制器应该在创建 Pet 时自动提取此值。

我需要帮助将 memberId 从 Member 编辑视图传递到 Pet 编辑视图,如果这是完成我想要做的事情的最佳方式,我还需要一般的想法。感谢您的时间和帮助!

【问题讨论】:

  • 所以您是在告诉我,您相信在创建用于编辑宠物的视图时,应将成员 ID 传递给该视图?
  • 嗨,托尼——正如我所说,我是新手,所以请原谅任何新手错误。由于我的视图是强类型的,我想我可以将 Pets 的强类型 memberId 字段设置为等于传入的 memberId。我也很好奇我是否可以在“添加宠物”按钮中传递整个成员模型并在宠物控制器中使用它?这可能是更可取的方法。
  • 您是否通过 cookie 对用户进行了身份验证?别担心,我们都从头开始:)
  • 这实际上是在管理部分,因此您可以编辑多个成员并将宠物添加到其中的任何一个。登录用户不是获得宠物关联的用户。
  • 哦。你可能应该把它放在问题中。这极大地改变了游戏。我很快就会在这里发布答案

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


【解决方案1】:

直接的方法是将 memberId 作为路由值传递给 CreatePet Action。

因此,您的 Member View 可能有一个如下所示的 Url 来导航到 CreatePet 操作:

@Url.Action("CreatePet", "PetController", new { memberId = Model.MemberId })

并且 CreatePet 操作将 memberId 作为参数

public ActionResult CreatePet(int memberId)
{
    ...
}

更新

从评论到问题:

我也很好奇我是否可以在“添加宠物”按钮中传递整个成员模型并在宠物控制器中使用它?这可能是最好的方法

这听起来不是一个好主意,原因有很多。为什么宠物需要对会员了解这么多?如果客户端欺骗了成员值怎么办——你不应该依赖它们,所以最好只使用作为路由值传递的 id 来查找成员服务器端。

【讨论】:

  • 谢谢乔,我实际上切换到你的答案,因为它直接回答了我的问题。托尼的回答也很棒,因为它为我指明了正确的方向,即使用 ViewModel 模式(这是我最终使用的)将额外的模型传递给视图。我希望我可以将两者都标记为已接受的答案。无论如何,感谢您提供易于实施的明确答案。
【解决方案2】:

因此,我所看到的处理此类问题的真正首选方法是使用 MVVM 模式,您可以在其中创建专为视图设计的 ViewModel 对象。虽然这看起来像,但我有很多意见!但这可能是您需要切换到动态视图的时候。但是,如果你不能,这种模式是一个很好的遵循。例如,您需要会员 ID 和我相信的宠物信息?你可以做的是传递一个包含宠物列表的对象,或者类似的东西。然后在视图模型中,您还可以传递成员 ID 列表或成员 ID。我不太清楚申请的重点。但底线是您创建一个特定于该视图的模型,该模型还利用实际模型来传递必要的信息。这个链接很好地描述了它。 http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx

祝你好运。

【讨论】:

  • 太棒了——这绝对为我指明了正确的方向,这基本上就是我所要求的!再次感谢。
  • 没问题,祝您有美好的一天!
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多