是否有可以使用RenderPartial渲染EditorTemplate的方法?
我在EditorTemplate中投入了大量精力,使用JQuery UI自动完成功能让用户从公司列表中进行选择。 (它使用HTML帮助程序来确保正确的JS库和CSS规则包含在生成的网页中的“正确”位置。)
在为同一个应用程序构建另一个页面时,我发现我想再次使用该模板,在构建EditorTemplate的模型之外。
这段代码完成了任务,但在某种程度上我只能考虑黑客攻击。
@using(Html.BeginForm()) {
ViewData.TemplateInfo.HtmlFieldPrefix = "CompanyName";
Html.RenderPartial("~/Views/Shared/EditorTemplates/Company.cshtml", string.Empty);
<input type="submit" value='Filter' />
}
因为我没有使用EditorFor,所以没有“name”参数,因此呈现的输入字段只是“CompanyName”的HtmlFieldPrefix。自动完成功能正常,我可以提交表单并过滤数据。但这种解决方案感觉草率和脆弱。任何人都有更好的主意吗?
答案 0 :(得分:-1)
我已将可重复使用的“控件”移动到app_code中的帮助程序,并使编辑器模板成为一个小包装器,以调用帮助程序。
我对DateTime的editorTemplate看起来像这样:
@model DateTime?
@using System.Globalization
@{
var name = MvcHtmlString.Create(ViewData.TemplateInfo.GetFullHtmlFieldName(""));
var id = MvcHtmlString.Create(ViewData.TemplateInfo.GetFullHtmlFieldId(""));
var value = Model.HasValue && Model.Value > DateTime.MinValue ? string.Format("{0:d}", Model) : "";
}
<span class="edit">
@Editor.DateTime(id, name, value)
</span>
我和app_code中的Editor.cshtml包含:
@helper DateTime(IHtmlString id, IHtmlString name, string value) {
<input type="text" class="editor-date" id="@id" name="@name" value="@value" />
if (HttpContext.Current.Items["editor-date"] == null) {
HttpContext.Current.Items["editor-date"] = new object();
<script type="text/javascript">
$(function () {
$(".editor-date").datepicker({ dateFormat: 'd/m/yy' });
});
</script>
}
}
所以我可以使用EditorFor的日期编辑器或任何其他方式,同时包含脚本只启动一次,并在一个地方更改所有代码。