MVC3 HTML扩展方法使用两个绑定,而不是通常的一个

时间:2012-05-14 01:25:35

标签: asp.net-mvc-3 extension-methods

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

谢谢!

1 个答案:

答案 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")