2

我正在尝试改进我的 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")

谢谢!

4

1 回答 1

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
           )
        {
            //...
        }

您现在可以像通常使用表达式一样使用表达式 2。(当然,您应该将其命名为直观的名称)。

用法将如问题中所述:

@Html.AutoCompleteFor(model => model.Customer.ID, model => model.Customer.Name, "/Customer/Autocomplete")
于 2012-12-03T01:52:07.690 回答