将EditorTemplate与RenderPartial一起使用

时间:2011-12-21 21:30:49

标签: asp.net-mvc razor renderpartial

是否有可以使用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。自动完成功能正常,我可以提交表单并过滤数据。但这种解决方案感觉草率和脆弱。任何人都有更好的主意吗?

1 个答案:

答案 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的日期编辑器或任何其他方式,同时包含脚本只启动一次,并在一个地方更改所有代码。