从另一个控制器渲染局部视图

时间:2017-08-29 20:52:16

标签: c# asp.net-mvc asp.net-mvc-4 single-responsibility-principle

我知道有很多次问过类似的问题,答案是使用相关视图的绝对路径。但是,仍然使用当前控制器而不是部分视图所属的控制器进行渲染。

我的目标是将特定模型的下拉列表视为  自包含组件,因此可以由具有该模型的外键的其他模型重用。例如,假设我有两个模型:DeviceDeviceTypeDevice包含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>

这可能吗?

1 个答案:

答案 0 :(得分:0)

您可以使用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响应流,这使得它很快。