繁体   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