2011-11-19 25 views
4

这真的很容易从控制器返回不同的视图:ASP.NET MVC:如何使用模型呈现不同的动作(不是视图)?

return View("../Home/Info"); 

不过,我需要的信息视图模型。 Info()动作结果方法中有很多内容。我可以复制它,并有这样的事情:

var infoModel = new InfoModel { 
    // ... a lot of copied code here 
} 
return View("../Home/Info", infoModel); 

但这是不合理的。

当然我可以重定向:

return RedirecToAction("Info"); 

但这样的URL将发生变化。我不想更改网址。这非常重要。

回答

8

它看起来像你想从一个不同的控制器调用一个动作。我建议你可能想简单地渲染一个视图,使用Html.Action()来呈现该动作,而不是试图将两者结合在控制器中。如果这样做不合理,那么您可能需要创建一个基本控制器,两个控制器都可以派生出基本控制器,并将共享代码放在基本控制器中生成模型。根据需要重新使用视图。

public ActionResult Foo() 
    { 
     return View(); 
    } 

美孚查看

@Html.Action("info", "home") 
+0

谢谢!只是一个小不:@ {Html.RenderAction(...); }更好的性能。 – Alex

+0

确实是我想要的,没有想到这一点。 – jeremy

9

您可以直接在动作中调用到另一个动作,是这样的:

public ActionResult MyAction(){ 
    if(somethingOrAnother){ 
     return MyOtherAction(); 
    } 
    return View(); 
} 

//"WhichEverViewYouNeed" is required here since you are returning this view from another action 
//if you don't specify it, it would return the original action's view 
public ActionResult MyOtherAction(){ 
    return View("WhichEverViewYouNeed", new InfoModel{...}); 
} 
+4

视图将对应于除非你指定查看您想明确表示,最初真实调用动作。 – tvanfosson

+0

@tvanfosson他的问题表明他已经在指定视图。 –

+3

是的,但在您的示例中,即使调用了* MyOtherAction *,它仍会查找* MyAction *视图。你需要做一个'返回View(“MyOtherAction”,新的InfoModel {...});'如果你总是想渲染与之相关的视图。 – tvanfosson

1

为什么不直接调用该操作的方法是什么?

+0

他说他不希望网址改变。 (我对MVC最大的失望之处在于,它让人们往往毫无意义地迷恋网址)。可能局部视图在这里起作用。 – Ryan

+0

@Ryan调用不同的操作方法,就像在我的回答中一样,不会*更改URL。而且我不认为这是让人们痴迷于不改变URL的MVC。搜索Server.Transfer并查看大量的WebForms痴迷。 –

相关问题