我的问题是-我如何使用这样的代码:
@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()
等
答案 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()
语法。您可以将所有自定义扩展都放在一个静态类中,这样它们就可以轻松地在项目中保持在一起。如果要强制使用命名约定,只需在所有自定义扩展方法的名称前加上“我的”或任何其他内容即可。