如何使用Razor htmlhelper在类似@ html.My.TextboxControl的情况下使用“我的”

时间:2019-01-28 08:37:51

标签: asp.net-mvc razor

我的问题是-我如何使用这样的代码:

@Html.My.SelectControl(Sub(settings)
    settings.Id = "mySelect"

    settings.Items.Add(Sub(itm)
        itm.Value = "1"
        itm.Text = "First"
        itm.Selected = False
    End Sub)

    settings.Items.Add(Sub(itm)
        itm.Value = "2"
        itm.Text = "Second"
        itm.Selected = True
    End Sub)
End Sub).GetHtml()

...产生这个结果...

<select id="mySelect">
    <option value="1">First</option>
    <option value="2" selected>second</option>
</select>

...?

我知道如何使用@ html.MyTextboxControl,但是我不知道如何对其进行“子类化”,因此我可以编写如下代码:

@html.My.TextboxControl(sub(settings) 
                       ' .settings. bla bla
                       ).GetHtml()

@html.My.ListboxControl(sub(settings) 
                       ' .settings. bla bla
                       ).GetHtml()

1 个答案:

答案 0 :(得分:0)

不能。扩展HtmlHelper<TModel>时实际使用的机制是Extension methods

顾名思义,这些是方法,而不是类,因此您不能子类化。 添加自定义方法的签名如下所示(C#,我对VB不熟悉):

public static class HtmlHelperExtensions {
    public static MvcHtmlString MySelectControl<TModel>(this HtmlHelper<TModel> html, Settings settings) {
            return new MvcHtmlString(/*....*/);
    }
}

我认为不需要@Hmtl.My.Foo()语法。您可以将所有自定义扩展都放在一个静态类中,这样它们就可以轻松地在项目中保持在一起。如果要强制使用命名约定,只需在所有自定义扩展方法的名称前加上“我的”或任何其他内容即可。