Asp.net mvc 如何在Html.RenderAction(MVC3)中发送模型对象
我使用的是MVC3 razor,我试图将一个对象传递给局部视图,但它不起作用 这可以在不将对象模型发送到局部视图的情况下正常工作:Asp.net mvc 如何在Html.RenderAction(MVC3)中发送模型对象,asp.net-mvc,asp.net-mvc-3,razor,asp.net-mvc-partialview,Asp.net Mvc,Asp.net Mvc 3,Razor,Asp.net Mvc Partialview,我使用的是MVC3 razor,我试图将一个对象传递给局部视图,但它不起作用 这可以在不将对象模型发送到局部视图的情况下正常工作: Html.RenderAction("Index", "ViewName"); 尝试这样做不会发送模型对象,而是得到空值(对象有数据,视图需要它):' 这甚至可以使用渲染吗 谢谢 编辑:我发现了错误,控制器的操作出现错误,没有拾取发送的对象。谢谢你的帮助 如果你想把foo作为模型传递,那么先让它通过 public class Foo { public st
Html.RenderAction("Index", "ViewName");
尝试这样做不会发送模型对象,而是得到空值(对象有数据,视图需要它):'
这甚至可以使用渲染吗
谢谢
编辑:我发现了错误,控制器的操作出现错误,没有拾取发送的对象。谢谢你的帮助 如果你想把
foo
作为模型传递,那么先让它通过
public class Foo {
public string Name { get; set; }
public int Age { get; set; }
}
现在做出一个行动结果
public ActionResult FooBar(Foo _foo){
return PartialView(_foo);
}
叫它
@Html.RenderAction("FooBar", "Controller", new { Name = "John", Age=20 });
假设您想将
foo
作为模型传递,请先进行传递
public class Foo {
public string Name { get; set; }
public int Age { get; set; }
}
现在做出一个行动结果
public ActionResult FooBar(Foo _foo){
return PartialView(_foo);
}
叫它
@Html.RenderAction("FooBar", "Controller", new { Name = "John", Age=20 });
通常,如果我已经有了一个可用的模型,那么使用
Html.Partial
比尝试渲染动作更有意义
@Html.Partial("Foo", Model.FooModel)
其中,Foo.cshtml
是一个视图文件(可能在您的共享文件夹中),强类型为with@model FooProject.Models.FooModel
或任何您的模型调用。这可以是您需要的复杂模型。Model是页面的主模型,必须在其中设置FooModel
——或者,如果Foo
视图使用与父页面相同的模型,则忽略此参数
RenderAction
通常在只有简单参数的情况下更好,因为您只是在模拟对具有路由/查询字符串参数的常规操作的请求,然后将该响应转储到页面中。如果您需要在页面模型中不可用的布局中放置某些内容,例如侧栏中的元素,则此功能非常有效。通常,如果我已经有可用的模型,则使用Html.Partial
比尝试呈现动作更有意义
@Html.Partial("Foo", Model.FooModel)
其中,Foo.cshtml
是一个视图文件(可能在您的共享文件夹中),强类型为with@model FooProject.Models.FooModel
或任何您的模型调用。这可以是您需要的复杂模型。Model是页面的主模型,必须在其中设置FooModel
——或者,如果Foo
视图使用与父页面相同的模型,则忽略此参数
RenderAction
通常在只有简单参数的情况下更好,因为您只是在模拟对具有路由/查询字符串参数的常规操作的请求,然后将该响应转储到页面中。如果您需要在页面模型中不可用的布局中放置某些内容,例如侧栏中的元素,则该方法非常有效。您实际上可以使用操作将对象传递给控制器方法。这可以在任何可用的视图上完成,例如,我在共享库中有一个视图,它构建到引用我的共享项目的项目bin文件夹中(属性-在Visual Studio中的视图文件上复制,如果更新)。是这样做的:
控制器:
public class GroovyController : Controller
{
public ActionResult MyTestView(MyModel m)
{
var viewPath = @"~\bin\CommonViews\MyTestView";
return View(viewPath, m);
}
}
@Html.Action("MyTestView", "Groovy", new { m = Model })
MVC页面(使用Razor语法):
public class GroovyController : Controller
{
public ActionResult MyTestView(MyModel m)
{
var viewPath = @"~\bin\CommonViews\MyTestView";
return View(viewPath, m);
}
}
@Html.Action("MyTestView", "Groovy", new { m = Model })
或者使用RenderAction
方法:
@{ Html.RenderAction("MyTestAction", "MyTestController", new { area = "area", m = Model }); }
注意:在
@Html.Action()
中,Model
对象的类型必须为MyModel
,第三个参数必须设置为控制器变量名,我的变量名为MyModel m
。m
是您必须分配给的对象,因此我可以使用Action将对象传递给控制器方法。这可以在任何可用的视图上完成,例如,我在共享库中有一个视图,它构建到引用我的共享项目的项目bin文件夹中(属性-在Visual Studio中的视图文件上复制,如果更新)。是这样做的:
控制器:
public class GroovyController : Controller
{
public ActionResult MyTestView(MyModel m)
{
var viewPath = @"~\bin\CommonViews\MyTestView";
return View(viewPath, m);
}
}
@Html.Action("MyTestView", "Groovy", new { m = Model })
MVC页面(使用Razor语法):
public class GroovyController : Controller
{
public ActionResult MyTestView(MyModel m)
{
var viewPath = @"~\bin\CommonViews\MyTestView";
return View(viewPath, m);
}
}
@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
您可以提供您正在调用的操作的签名吗?为什么要将viewname作为参数传递?您应该传递操作和控制器instead@Html.RenderAction(“Index”,“ViewName”,new{objectParam1=objectModel1,objectParam1=objectModel2})您可以提供您正在调用的操作的签名吗?为什么要将ViewName作为参数传递?您应该传递操作和控制器instead@Html.RenderAction(“索引”,“视图名”,新的{objectParam1=objectModel1,objectParam1=objectModel2})感谢您的回答。我在控制器的动作签名中忽略了一个错误。修复了它,现在它得到了对象。这个通过ModelState了吗?谢谢!但我必须用大括号将Html.RenderAction调用包围起来才能使其工作。否则,Razor会说“不能隐式地将类型'void'转换为'object'”,谢谢您的回答。我在控制器的动作签名中忽略了一个错误。修复了它,现在它得到了对象。这个通过ModelState了吗?谢谢!但我必须用大括号将Html.RenderAction调用包围起来才能使其工作。否则,Razor说“不能隐式地将类型'void'转换为'object'”,这应该是可以接受的答案。感谢您在一年后添加它。@Valamas AUS谢谢:)这应该是公认的答案。感谢您在一年后添加它。@Valamas AUS谢谢:)