23

我正在使用 MVC3 剃须刀,并且试图将对象传递给局部视图,但它不起作用。

在不将对象模型发送到局部视图的情况下,这可以正常工作:

Html.RenderAction("Index", "ViewName");

尝试这样做不会发送模型对象,而是得到空值(对象有数据,视图需要它):'

Html.RenderAction("Index", "ViewName", objectModel);

这甚至可以使用 RenderAction 吗?

谢谢!

编辑:我发现了错误,控制器的操作出错,没有拾取发送的对象。感谢你的帮助!

4

3 回答 3

35

您实际上可以使用 Action 将对象传递给控制器​​方法。这可以在任何可用的视图上完成,例如,我在一个共享库中有一个,它被构建到项目 bin 文件夹中,这些文件夹引用了我的共享项目(属性 - 如果视图文件较新,则在 Visual Studio 中复制)。它是这样完成的:

控制器:

public class GroovyController : Controller
{
    public ActionResult MyTestView(MyModel m)
    {
        var viewPath = @"~\bin\CommonViews\MyTestView";
        return View(viewPath, m);
    }
}

MVC 页面(使用 Razor 语法):

@Html.Action("MyTestView", "Groovy", new { m = Model })

或使用RenderAction方法:

@{ Html.RenderAction("MyTestAction", "MyTestController", new { area = "area", m = Model }); }

注意:在 中@Html.Action()Model对象必须是类型MyModel,并且第三个参数必须设置为控制器变量名称,我的是MyModel m. 这m是你必须分配的,所以我这样做m = Model

于 2013-05-02T23:02:24.120 回答
27

说你想通过foo模型,先做

public class Foo {
    public string Name { get; set; }
    public int Age { get; set; }
}

现在制作一个 ActionResult

public ActionResult FooBar(Foo _foo){
    return PartialView(_foo);
}

称它为

@Html.RenderAction("FooBar", "Controller", new { Name = "John", Age=20 });
于 2012-01-22T06:34:27.863 回答
6

通常,如果我有一个可用的模型,那么使用它Html.Partial比尝试渲染一个动作更有意义。

@Html.Partial("Foo", Model.FooModel)

一个视图文件(可能在您的共享文件夹中)在哪里Foo.cshtml是强类型的 with@model FooProject.Models.FooModel或您的模型所调用的任何内容。这可以是您需要的复杂模型。模型是您必须设置的页面的主要模型FooModel- 如果Foo视图使用与父页面相同的模型,则忽略此参数。

RenderAction当您只有简单的参数时通常会更好,因为您只是模拟对具有路由/查询字符串参数的常规操作的请求 - 然后将该响应转储到您的页面中。如果您需要在页面模型中不可用的布局中放置一些东西,例如侧栏中的元素,它会很好地工作。

于 2013-02-06T11:07:52.540 回答