3

我会尽量保持简短:

在视图中

@Html.RenderPartial("myview", Model.SubModel, 
     new ViewDataDictionary()
     {
          { "thing", Model.Thing }
     })

在 myview 中,我们看到“thing”是可用的,即这会在 myview 视图中产生 Model.Thing 的值:

@ViewBag.thing

伟大的!简单的

但是我需要对事物做一些事情(顺便说一下,事物不能成为 SubModel 的一部分),即在我的视图引擎或理想情况下在控制器中访问它,例如:

public ActionResult myview(SubModelType vm)
{
    var thing = ViewBag.thing; // oh dear this doesnt exist.. but is there when the view is rendered

所以我的问题是,如果 ViewBag 在生成的 myview 中可用,它必须以某种方式在 httpcontext 中传递,或者在 controllercontext 的某个地方传递?有谁知道为什么它在控制器中不可用但在视图中以及我如何能够访问它?

编辑

对不起,我在这里错过了一个关键点!当“myview”被发送回控制器时,调用一个名为 myview 的操作,我希望在其中呈现给 myview 的 ViewBag 可用。但当然不是,它已在“myview”中使用,仅此而已。因此,如果我想在 myview 操作中使用它,我需要将其存储在该视图的 ViewBag 中,或者设置 viewmodel 的一些值,以便可以将其返回到操作中。

那有意义吗?

4

1 回答 1

1

对不起,我在这里错过了一个关键点!当“myview”被发送回控制器时,调用一个名为 myview 的操作,我希望在其中呈现给 myview 的 ViewBag 可用。

哦不,你不可能期待这样的事情。这不是 ASP.NET MVC 的工作方式。当您向控制器操作发送 HTTP 请求时,默认模型绑定器将拦截此请求并查看请求中发布的值并将它们绑定到您的操作参数:

[HttpPost]
public ActionResult myview(SubModelType vm, ThingViewModel thing)
{
    ...
}

这显然假设这些事物值是原始请求的一部分。因此,例如,如果您提交一个表单,您应该在该表单中包含模型绑定器可以使用的相应字段。

可以这样想:可以从任何客户端调用 ASP.NET MVC 控制器操作。例如来自 iPhone 应用程序。正如你所知,iOS 中没有这样的概念ViewBag。所有这一切都会发生,默认模型绑定器将查看已发布的值并尝试对您的操作作为参数的视图模型进行水合。

另一方面,如果您无法将这些事物值作为请求的一部分(通过在表单中​​包含相应的输入字段),您只能从隐藏字段中发送此的 ID,然后在您的控制器操作中使用此 ID 进行查询您的底层数据存储,用于从您首次呈现此表单时最初检索的同一位置检索事物

有些人可能还建议您将事物存储在 Session 中,然后在 POST 操作中从 Session 中读取值。我不是那些人。这是一种替代方法。

于 2013-02-03T18:02:57.180 回答