MVC3的RenderPartial和ViewBag

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的操作时,我希望ViewBag呈现到myview中可用。但当然不是这样,它已经在“myview”中使用了。所以,如果我想在myview操作中使用它,我需要将其存储在该视图的ViewBag中,或者设置一些视图模型的值,以便可以将其提交回操作。
这有意义吗?

我期望ViewBag数据在控制器渲染视图或视图引擎的某个时刻可用。不详细解释原因:有些数据我不想存储在模型中,但需要在控制器中可用。一种解决方法是将其添加到初始视图中的SubModel中,例如Model.SubModel.Dict.Add("thing", 123)。但我不想在我的视图中使用这样的逻辑。ViewBag数据应该在ControllerContext(或HttpContext)中的视图呈现之前可用,否则它如何到达视图? - Mr AH
1
ViewData是视图和ControllerContext的属性。这就是它如何到达视图的方式。但在您的情况下,您正在从主视图中传递它到部分视图。控制器在这里绝对没有关系。当发生这种情况时,控制器已经被垃圾回收了很久。您希望在提交某些表单或在AJAX请求中将此值传回控制器吗?请原谅我的愚蠢,但我仍然不明白您想要实现什么。 - Darin Dimitrov
“Subview”或部分视图之所以具有完全不同的范围,是有原因的。 - Dave Alperovich
@MrAH,你的优先级是理解为什么会发生这种情况还是找到解决方法? - Dave Alperovich
抱歉大家 - 我在这里错过了一个至关重要的点。实际上这是一个稍微不同的问题。我完全理解你们所说的,即我已经超越了控制器阶段。 - Mr AH
显示剩余3条评论
1个回答

1
抱歉,我在这里错过了一个重要的要点!当“myview”被发送回控制器时,调用名为myview的操作,我期望ViewBag呈现给myview可用。
哦,不,你不可能期望任何类似的事情。这不是ASP.NET MVC的工作方式。当您向控制器操作发送HTTP请求时,默认模型绑定程序将拦截此请求,并查找请求中的发布值并将其绑定到操作参数:
[HttpPost]
public ActionResult myview(SubModelType vm, ThingViewModel thing)
{
    ...
}

这显然假设那些thing值是原始请求的一部分。例如,如果您提交表单,应在该表单内包含相应的字段,以便模型绑定器可以使用。
这样想:ASP.NET MVC控制器操作可以从任何客户端调用。例如,从iPhone应用程序。而且正如您所知,在iOS中没有ViewBag的概念。所有发生的事情就是默认的模型绑定器将查看POST的值并尝试填充作为参数传递给您的操作的视图模型。
另一方面,如果您无法使这些thing值成为请求的一部分(通过在表单中包含相应的输入字段),则只能从隐藏字段发送此thin的ID,然后在控制器操作内部使用此ID查询底层数据存储库以检索thing,就像您在首次呈现此表单时最初检索它的位置一样。
有些人可能还建议您将Thing存储在会话中,然后在POST操作中从会话中读取该值。我不是来自这些人。这是另一种方法。

非常感谢,是的,我觉得我有点陷入了困境。我完全意识到我们只谈论HTML表单数据,如果我没有将我的“thing”值显式地添加到要发布的数据中(即通过将其添加到呈现的视图模型或部分视图中的“new” ViewBag),那么我不能指望它在操作方法中可用。 - Mr AH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接