2011-11-19 74 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癡迷。 –

相關問題