MVC3 RenderPartial和ViewBag

时间:2013-02-03 17:15:28

标签: asp.net-mvc-3 razor viewbag

我会尽量保持这个简短的说明:

在视图中

@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的某个值,以便可以将其置于操作中。

这有意义吗?

1 个答案:

答案 0 :(得分:1)

  

抱歉,我错过了一个重要的观点!这是“myview”发布回来的时候   到控制器,我会调用一个名为myview的动作   期望渲染到myview的ViewBag可用。

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

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

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

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

另一方面,如果您不能将这些 thing 值作为请求的一部分(通过在表单中​​包含相应的输入字段),则只能发送此 thin的ID 从隐藏字段然后在控制器操作内部使用此ID来查询底层数据存储,以便在您首次呈现此表单时从最初检索它的同一位置检索 thing 。 p>

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