asp.net-mvc-3 - MVC3 RenderPartial 和 ViewBag

标签 asp.net-mvc-3 razor viewbag

我会尽量保持简短:

在 View 中

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

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

@ViewBag.thing

太棒了!简单

但是我需要对事物做一些事情(顺便说一句,事物不能是子模型的一部分),即在我的 View 引擎中或最好在 Controller 中访问它,例如:

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 中的某个地方传递,对吧?有谁知道为什么它在 Controller 中不可用但在 View 中以及我如何访问它?

编辑

抱歉,我错过了一个重要的点!当“myview”被发送回 Controller 时,调用一个名为 myview 的操作,我希望渲染到 myview 的 ViewBag 可用。但当然不是,它已经用在“myview”中了,仅此而已。因此,如果我想在 myview 操作中使用它,我需要将其存储在该 View 的 ViewBag 中,或者设置 View 模型的某些值,以便可以将其返回到操作中。

这有意义吗?

最佳答案

Sorry I missed a vital point here! It's when "myview" is posted back to the controller, invoking an action called myview where I would expect the ViewBag rendered to myview to be available.

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

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

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

这样想:可以从任何客户端调用 ASP.NET MVC Controller 操作。例如,来自 iPhone 应用程序。如您所知,iOS 中没有 ViewBag 这样的概念。所发生的只是默认模型绑定(bind)器将查看 POSTed 值并尝试水合您的操作作为参数的 View 模型。

另一方面,如果您无法将这些事物值作为请求的一部分(通过在表单中​​包含相应的输入字段),您只能发送该事物的ID 来自隐藏字段,然后在您的 Controller 操作中使用此 ID 查询您的基础数据存储,以从您首次呈现此表单时最初检索它的同一位置检索事物。 p>

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

关于asp.net-mvc-3 - MVC3 RenderPartial 和 ViewBag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14675015/

相关文章:

c# - 使用 MVC3、Razor 和 C# 的插件系统

asp.net-mvc - EntityType 'ApplicantPosition' 没有定义键

c# - 如何将 viewbag 值作为 javascript/jquery 中的变量?

jquery - 停止 Visual Studio 提示 Razor 和 JQuery

c# - 返回列表查看

c# - 如何仅显示已分配给 c#、mvc 中的 viewbag 的列表中的第一个对象

asp.net-mvc - Html5 data-* with asp.net mvc TextboxFor html属性

asp.net-mvc-3 - Ajax.BeginForm 返回整页

asp.net-mvc-3 - 如何在 ASP.Net MVC 3 razor View 中使用 Ajax 和 Jquery 加载页面部分?

asp.net-mvc - 支持 Asp.NET MVC Razor 的编辑器