【发布时间】:2017-08-30 08:19:07
【问题描述】:
我知道类似的问题已经被问过很多次了,答案是使用绝对路径指向相关视图。但是,它仍然使用当前的控制器,而不是局部视图所属的控制器来渲染。
我的目标是将特定模型的下拉列表视为
自包含组件,因此它可以被具有该模型外键的其他模型重用。例如,假设我有两个模型:Device 和 DeviceType。 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>
这可能吗?
【问题讨论】:
-
类似
@{Html.RenderAction("TemplateMethod","DeviceTypes");} -
如果您需要重新使用特定控件,可以使用显示模板。由于您不想在每个模型中一次又一次地重新创建相同的属性,因此使用该属性创建一个基类,然后使用它
-
@VidiyaPrasanth Inheritance 并不是一个真正的选择,因为 C# 不允许多重继承。如果模型需要两个查找表,而不仅仅是一个怎么办?如果多个不同的模型需要查找表的不同组合怎么办?我目前正在尝试让
Html.RenderAction工作,因为这似乎是最有希望的选择。 -
@Hackerman 为我解决了问题。你想把它写成答案,我会接受吗?还值得注意的是,任何子请求(例如通过 Html.RenderAction)都必须同步运行
-
@AndrewWilliamson,完成!!
标签: c# asp.net-mvc asp.net-mvc-4 single-responsibility-principle