【问题标题】:Render a partial view from another controller从另一个控制器渲染局部视图
【发布时间】:2017-08-30 08:19:07
【问题描述】:

我知道类似的问题已经被问过很多次了,答案是使用绝对路径指向相关视图。但是,它仍然使用当前的控制器,而不是局部视图所属的控制器来渲染。

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

这可能吗?

【问题讨论】:

  • 类似@{Html.RenderAction("TemplateMethod","DeviceTypes");}
  • 如果您需要重新使用特定控件,可以使用显示模板。由于您不想在每个模型中一次又一次地重新创建相同的属性,因此使用该属性创建一个基类,然后使用它
  • @VidiyaPrasanth Inheritance 并不是一个真正的选择,因为 C# 不允许多重继承。如果模型需要两个查找表,而不仅仅是一个怎么办?如果多个不同的模型需要查找表的不同组合怎么办?我目前正在尝试让Html.RenderAction 工作,因为这似乎是最有希望的选择。
  • @Hackerman 为我解决了问题。你想把它写成答案,我会接受吗?还值得注意的是,任何子请求(例如通过 Html.RenderAction)都必须同步运行
  • @AndrewWilliamson,完成!!

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


【解决方案1】:

你可以使用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 响应流,因此速度更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多