从另一个控制器渲染局部视图
Render a partial view from another controller
我知道类似的问题已被问过很多次,答案是使用指向相关视图的绝对路径。但是,仍然使用当前控制器,而不是局部视图所属的控制器来渲染。
我的目标是将特定模型的下拉列表视为
自包含组件,因此它可以被具有该模型外键的其他模型重新使用。例如,假设我有两个模型:Device
和 DeviceType
。 Device
包含一个 DeviceTypeId
字段,该字段在编辑模板中将显示为一个下拉列表,其中包含所有可用 DeviceTypes
.
的名称
通常,您必须将模型和设备类型列表包装在单独的 DeviceViewModel
class 中,并让控制器在呈现页面之前填充两者。然后你会用类似下面的东西来模板化它:
<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");}
From the following article: http://www.dotnettricks.com/learn/mvc/renderpartial-vs-renderaction-vs-partial-vs-action-in-mvc-razor
- 此方法结果将直接写入 HTTP 响应流意味着它使用与当前 webpage/template.
中使用的相同的 TextWriter 对象
- 对于这个方法,我们需要创建一个子动作来渲染局部视图。
RenderAction 方法在部分视图中显示的数据独立于相应视图时很有用model.For 示例:在博客中要在每个页面上显示类别列表,我们希望使用 RenderAction 方法,因为类别列表由不同的模型填充。
@{Html.RenderAction("Category","Home");}
当你想缓存局部视图时,这种方法是最好的选择。
- 此方法比 Action 方法更快,因为它的结果直接写入 HTTP 响应流,因此速度很快。
我知道类似的问题已被问过很多次,答案是使用指向相关视图的绝对路径。但是,仍然使用当前控制器,而不是局部视图所属的控制器来渲染。
我的目标是将特定模型的下拉列表视为
自包含组件,因此它可以被具有该模型外键的其他模型重新使用。例如,假设我有两个模型:Device
和 DeviceType
。 Device
包含一个 DeviceTypeId
字段,该字段在编辑模板中将显示为一个下拉列表,其中包含所有可用 DeviceTypes
.
通常,您必须将模型和设备类型列表包装在单独的 DeviceViewModel
class 中,并让控制器在呈现页面之前填充两者。然后你会用类似下面的东西来模板化它:
<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");}
From the following article: http://www.dotnettricks.com/learn/mvc/renderpartial-vs-renderaction-vs-partial-vs-action-in-mvc-razor
- 此方法结果将直接写入 HTTP 响应流意味着它使用与当前 webpage/template. 中使用的相同的 TextWriter 对象
- 对于这个方法,我们需要创建一个子动作来渲染局部视图。
RenderAction 方法在部分视图中显示的数据独立于相应视图时很有用model.For 示例:在博客中要在每个页面上显示类别列表,我们希望使用 RenderAction 方法,因为类别列表由不同的模型填充。
@{Html.RenderAction("Category","Home");}
当你想缓存局部视图时,这种方法是最好的选择。
- 此方法比 Action 方法更快,因为它的结果直接写入 HTTP 响应流,因此速度很快。