有没有办法动态包装/拦截 HtmlHelper 扩展方法。认为装饰器模式

发布于 2024-12-05 17:28:31 字数 357 浏览 0 评论 0原文

我希望 System.Web.Mvc.Html 中提供的包装/拦截 HtmlHelper 扩展方法(TextBox、Hidden 等)能够在 2 个单独的用例中重用相同的部分视图。 Partial 的示例:

@model BlogEntry

@Html.TextBoxFor(t => t.Title)
@Html.TextAreaFor(t => t.Body)
@* Etc *@

Partial 的调用者将知道上下文(即是否覆盖或离开 MS imp)。

覆盖的原因多种多样。例如:在 JQuery 模板中使用,在上面的示例中,值属性的输出将为“${Title}”,或者添加 Html5 元数据。

I would like wrap/intercept HtmlHelper extension methods (TextBox, Hidden, etc) provided in System.Web.Mvc.Html to enable reuse of the same Partial Views in 2 separate use cases.
Ex of Partial:

@model BlogEntry

@Html.TextBoxFor(t => t.Title)
@Html.TextAreaFor(t => t.Body)
@* Etc *@

The caller of the Partial will know the context (i.e. whether to override or leave the MS imp).

The reason for overriding are various. For example: to use in JQuery templates, where the output for the value attribute would be "${Title}" on the example above or to add Html5 meta data.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

源来凯始玺欢你 2024-12-12 17:28:31

我不确定您对添加自己的扩展方法有何担忧 - 为什么您必须“创建自己的基本视图页面并完全接管”。您可以在任何页面中调用自定义帮助程序,就像调用内置帮助程序一样:

@Html.TextBoxFor(x => x.Name)
@Html.MyTextBoxFor(x => x.Name)

此外,您可以向方法添加某种标志参数,以控制它是只执行默认功能还是执行自定义功能。

当您创建自己的扩展方法时,您必须更改方法的签名或名称。

我曾经使用唯一的名称,但最终发现我真的希望能够快速区分我自己的实现和默认实现,因此我有时会使用:

@Html.Custom().TextBoxFor(…
@Html.Custom().TextAreaFor(…

基本上,您创建一个新的扩展方法,该方法采用 HtmlHelper; 并返回一个 CustomHelpers

    public static CustomHelpers<TModel> Custom<TModel>(this HtmlHelper<TModel> html)
    {
        return new CustomHelpers<TModel>(html);
    }

CustomHelpers 类定义了您自己的所有实现:

    public class CustomHelpers<TModel>
    {
        private readonly HtmlHelper<TModel> _html;

        public CustomHelpers(HtmlHelper<TModel> html) { _html = html; }

        public MvcHtmlString TextBoxFor<TProperty>(Expression<Func<TModel, TProperty>> expression)
        {
            // because you have a reference to the "native" HtmlHelper<TModel>, you
            // can use it here and extend or modify the result, almost like a decorator;
            // you can get the "native" result by calling _html.TextBoxFor(expression)
        }

因此,您对 TextBoxFor 的“重写”可以从您的部分视图接收一个标志,以确定它是否返回本机结果或特定于上下文的东西。

同样,CustomHelpers 类是完全可选的。您将添加一个标志参数或类似于自定义助手签名的参数,这样就不会与现有助手发生冲突。

它带来的好处是潜在地命名你的助手。你可以有:

@Html.TextBoxFor(…
@Html.JQuery().TextBoxFor(…
@Html.Mobile().TextBoxFor(…

I'm not sure what your concerns are with adding your own extension methods -- why you'd have to "create your own base view page and completely take over." You can call your custom helpers in any page just as you would the built-in helpers:

@Html.TextBoxFor(x => x.Name)
@Html.MyTextBoxFor(x => x.Name)

Furthermore, you can add some sort of flag parameter to your method to control whether it just executes the default functionality or something custom.

When you create your own extension methods, you'll have to either change the signature or the name of the method.

I used to use unique names, but ultimately found that I really wanted to be able to quickly discern my own implementations from the default, so I sometimes use:

@Html.Custom().TextBoxFor(…
@Html.Custom().TextAreaFor(…

Basically, you create one new extension method that takes an HtmlHelper<T> and returns a CustomHelpers<T>.

    public static CustomHelpers<TModel> Custom<TModel>(this HtmlHelper<TModel> html)
    {
        return new CustomHelpers<TModel>(html);
    }

The CustomHelpers<T> class defines all of your own implementations:

    public class CustomHelpers<TModel>
    {
        private readonly HtmlHelper<TModel> _html;

        public CustomHelpers(HtmlHelper<TModel> html) { _html = html; }

        public MvcHtmlString TextBoxFor<TProperty>(Expression<Func<TModel, TProperty>> expression)
        {
            // because you have a reference to the "native" HtmlHelper<TModel>, you
            // can use it here and extend or modify the result, almost like a decorator;
            // you can get the "native" result by calling _html.TextBoxFor(expression)
        }

So, your "override" of TextBoxFor can receive a flag from your partial view to determine whether it returns the native result or something specific to the context.

Again, the CustomHelpers<T> class is entirely optional. You'll be adding a flag parameter or something similar to the signature of your custom helpers, so you won't collide with existing helpers.

The benefit it confers is to potentially namespace your helpers. You could have:

@Html.TextBoxFor(…
@Html.JQuery().TextBoxFor(…
@Html.Mobile().TextBoxFor(…
小女人ら 2024-12-12 17:28:31

无法拦截对内置帮助器扩展方法的调用。但是,您可以编写自己的扩展方法,根据上下文执行正确的操作。

There is no way to intercept calls to the built-in helper extension methods. However you could write your own extension methods that do the right thing based on the context.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文