簡體   English   中英

從另一個控制器渲染局部視圖

[英]Render a partial view from another controller

我知道類似的問題已經問過很多次了,答案是使用絕對路徑訪問所討論的視圖。 但是,它仍使用當前控制器(而不是部分視圖所屬的控制器)進行渲染。

我的目標是將特定模型的下拉列表視為獨立組件,以便具有該模型外鍵的其他模型可以重用該列表。 例如,假設我有兩個模型: DeviceDeviceType Device包含一個DeviceTypeId字段,該字段在編輯模板中將顯示為一個下拉列表,其中包含所有可用DeviceTypes的名稱。

通常,您必須將模型和設備類型列表包裝在單獨的DeviceViewModel類中,並在呈現頁面之前讓控制器同時填充兩者。 然后,您可以使用類似以下內容的模板:

<div class="editor-field">
    @Html.DropDownListFor(model => model.Device.DeviceTypeId, Model.AllDeviceTypes)
    @Html.ValidationMessageFor(model => model.Device.DeviceTypeId)
</div>

我不喜歡這種解決方案-對於每個模型,我都必須創建一個匹配的視圖模型,其中包括下拉列表的查找表。 這也意味着DevicesController必須知道如何獲取DeviceTypes列表,這似乎是DeviceTypesController應該做的工作。 理想情況下,我想在DeviceTypesController上定義一個局部視圖,該視圖填充並呈現一個下拉列表,然后所有其他視圖可以僅包含該視圖:

    <div class="editor-field">
        <!-- Somehow make the DeviceTypesController render the partial here -->
        @Html.ValidationMessageFor(model => model.DeviceTypeId)
    </div>

這可能嗎?

您可以使用RenderAction

@{Html.RenderAction("TemplateMethod","DeviceTypes");}

從以下文章中: http : //www.dotnettricks.com/learn/mvc/renderpartial-vs-renderaction-vs-partial-vs-action-in-mvc-razor

  1. 此方法結果將直接寫入HTTP響應流,這意味着它使用與當前網頁/模板中相同的TextWriter對象。
  2. 對於這種方法,我們需要創建一個子動作來渲染局部視圖。
  3. 當局部視圖中的顯示數據獨立於相應的視圖模型時,RenderAction方法很有用。例如:在一個博客中,每個頁面都顯示類別列表,我們希望使用RenderAction方法,因為類別列表由不同的模型。

    @{Html.RenderAction("Category","Home");}

  4. 當您要緩存部分視圖時,此方法是最佳選擇。

  5. 此方法比Action方法快,因為它的結果直接寫入到HTTP響應流中,因此速度更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM