Как я могу использовать «Мой» как @ html.My.TextboxControl с помощью Razor htmlhelper - PullRequest
0 голосов
/ 28 января 2019

У меня вопрос - как я могу с кодом, подобным этому:

@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 голосов
/ 29 января 2019

Вы не можете.Механизм, который вы фактически используете, когда вы расширяете HtmlHelper<TModel>, это методы расширения .

Как следует из названия, это методы , а не классы, поэтому вы можетеПодкласс.Подпись для добавления пользовательских методов выглядит следующим образом (C #, я не знаком с VB):

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

Я не вижу необходимости в синтаксисе @Hmtl.My.Foo().Вы можете поместить все свои пользовательские расширения в один статический класс, чтобы их можно было легко хранить вместе в вашем проекте.Если вы хотите применить соглашение об именах, просто добавьте в качестве префикса имена всех ваших пользовательских методов расширения "My" или что-то еще.

...