2011-11-01 82 views
61

有沒有辦法在我的控制器視圖內渲染A從其他控制器的局部視圖B渲染從其他控制器的部分視圖

編輯:我寫的是良好的只有兩個控制器的局部視圖,我不希望它複製到自己的兩個視圖文件夾。
我希望每次發生視圖時都會顯示局部視圖,而不是發生某種事情後。

+1

這可能意味着一些不同的東西。你只是想重用視圖(由控制器A生成的模型)?你想調用生成視圖的控制器操作嗎?你想在頁面呈現後使用AJAX動態加載視圖嗎? – tvanfosson

+0

你能更具體嗎?你想要達到什麼目的? –

+1

@ Html.Action( 「YourPartialViewAction」, 「ControllerName」,新{ID = Model.id})我描述了多想我要實現 –

回答

75
  1. 您可以通過將它們放入瀏覽/共享文件夾共享控制器之間的看法。然後每個控制器可以按名稱呈現該視圖。
  2. 可以渲染的局部視圖(其可以控制器之間被共享,如(1))使用Html.Partial()當前視圖內。
  3. 您可以使用Html.Action()當前視圖中調用不同的控制器上的操作和渲染的結果。
  4. 您可以使用AJAX在頁面渲染後從其他控制器加載部分視圖。
+0

關於選項3:我可以調用我的控制器並從其他控制器渲染局部視圖嗎?不使用相對路徑謝謝! – gdoron

+0

@gdoron您可以在一個或另一個控制器中本地化生成部分視圖的代碼,並在兩個控制器中通過'Html.Action()'包含視圖。 – tvanfosson

+5

5.您也可以通過提供完整路徑作爲部分視圖來呈現@ Html.Partial(「〜/ Views/Partials/Location.cshtml」,Model) –

17

是,

return PartialView("/path/view.cshtml"); 

你只需要計算出路徑的一部分。

或者你可以把意見/局部視圖共享然後就返回:

return PartialView("view.cshtml"); 
+1

我不想讓partialview共享。而相對路徑並不適合mvc路由系統。其他建議? – gdoron

+0

這裏只是一個小小的懷疑。 PartialView方法返回HTML編碼字符串還是原始html? – Karan

1
@model YourModelNamesapce.ModelName 
@{ 
    ViewBag.Title = "Edit"; 
    Layout = "~/Views/Shared/_LayoutForPartialViews.cshtml"; 
} 
<table> 
    <tr> 
     <td> 
      @Html.LabelFor(model => model.fieldname) 
     </td> 
     <td> 
      @Html.DisplayFor(model => model.fieldname) 
     </td> 
    </tr> 
    <tr> 
     <td>@Html.Action("PartialViewAction", "Controller", new { id = Model.id })</td> 
    </tr> 
</table> 
+0

對不起,這是怎麼回答我的問題?! – gdoron

+0

gordon,我已經更新了我的答案 –

+1

這不是一個非常明確的答案,但是Hari指出DisplayFor是一個不錯的選擇。 – mcfea

44
@Html.Partial("~/Views/ControllerB/Index.cshtml") 
+3

最簡單的解決方案。 :D – wooncherk

+0

是否可以在控制器上調用動作而不是直接查看? – FrenkyB

1

只是一個側面說明,因爲我發現這個線程搜索同樣的問題,但答案沒有工作:在果園CMS模塊,則不能使用張貼Pittfall的neat solution,你必須使用相對路徑返回部分視圖。比方說你有一個控制器

Controllers/SiteController.cs 

,並要返回局部視圖

Shared/MessageList/Items 

然後在動作方法中,你需要寫

return PartialView("../Shared/MessageList/Items");