我正在尝试优化我的HTML扩展方法,以便我可以将ID和Value组件绑定到这样的工作:
@Html.AutoCompleteFor(model => model.Customer.ID, model => model.Customer.Name, "/Customer/Autocomplete")
我目前这样做:
@Html.AutoCompleteFor(model => model.CustomerID, model => model.CustomerID_display, "/Customer/Autocomplete")
我需要扩展模型以包含CustomerID_display,这有点笨重,并且需要非常具体的后期处理。
我需要绑定显示值(实体的文本名称)的原因是,如果用户输入新项目,则可以检测到它并可能自动生成。
我上面的预期方法当然不起作用,我可能会偏离标记。但你应该有效地知道我正在做什么。如果我上面的预期方法有效,我对AutoCompleteFor的实现将非常简单(现在每个人都使用了这个词的简单!)。我期待lambda可能会更有用,或许:
@Html.AutoCompleteFor(model => new AutoCompleteBinding { ID = model.Customer.ID, Name = model => model.Customer.Name }, "/Customer/Autocomplete")
谢谢!
答案 0 :(得分:1)
在HTML“... For”扩展程序中,通常只有一个Expression参数。
public static MvcHtmlString AutoCompleteFor<TModel, TValue>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TValue>> expression,
object postingTextBoxHtmlAttributes,
string extraArguments,
string sourceURL
)
{
//...
}
只需展开它,包含另一个表达式。添加:
Expression<Func<TModel, TValue>> expression
制作:
public static MvcHtmlString AutoCompleteFor<TModel, TValue>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TValue>> expression,
Expression<Func<TModel, TValue>> expression2,
object postingTextBoxHtmlAttributes,
string extraArguments,
string sourceURL
)
{
//...
}
您现在可以像使用表达式一样使用expression2。 (当然你应该直截了当地说出来。)
用法将如问题所述:
@Html.AutoCompleteFor(model => model.Customer.ID, model => model.Customer.Name, "/Customer/Autocomplete")