为什么lambda表达式有效,但直接访问Model对象时却没有?

时间:2010-08-26 12:53:52

标签: asp.net-mvc-2 html.dropdownlistfor

这是我得到的错误:

  

描述:期间发生错误   编译所需的资源   为此请求提供服务。请查阅   以下具体错误详情   并修改您的源代码   适当。

     

编译器错误消息:CS0411:   方法的类型参数   “System.Web.Mvc.Html.SelectExtensions.DropDownListFor(System.Web.Mvc.HtmlHelper,   System.Linq.Expressions.Expression>中   System.Collections.Generic.IEnumerable)”   无法从使用中推断出来。尝试   指定类型参数   明确。

<div class="editor-field">
    <%: Html.DropDownListFor(model => model.Country, ViewData["Countries"] as SelectList) %>
    <%: Html.DropDownListFor(Model.Country, ViewData["Countries"] as SelectList) %>
    <%: Html.ValidationMessageFor(model => model.Country) %>
</div>

第一个DropDownListFor效果很好;第二个给了我例外。我很好奇为什么会这样。如果我直接输入模型,我仍然会得到它的归属列表。为什么这会破裂?

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

DropDownListFor需要一个lambda表达式(实际上是Expression<Func<TModel, TProperty>>)。 Model.Country既不是表达也不是函数,所以它不会在那里工作。

检查MSDN SelectExtensions.DropDownListFor

答案 1 :(得分:0)

它与辅助方法的方法签名有关。它用于对象的通用动态评估。

您可以将自己的重载写入仅使用所需功能的帮助程序。

答案 2 :(得分:0)

在一个非常相似的说明中,我遇到了MVC3 / Razor的这个问题,因为我在HTML中循环遍历模型的集合。我试图使用循环变量,我得到了这个错误。在我的例子中,解决方案是使用我的LINQ查询中的循环变量返回模型。

我的循环:

@foreach (BookField bookField in Model.BookFields)

更改@ Html.DropDownListFor中的第一个parm来自...

bookField

要...

model => model.BookFields.First(q => q.BookFieldId == bookField.Id).Value

完整的陈述现在看起来像这样:

@Html.DropDownListFor(model => model.BookFields.First(q => q.BookFieldID == bookField.Id).Value, new SelectList(ViewData[ddlKey] as Dictionary<string, string>, "Key", "Value", bookField.Value), "[select]")

注意,我为这个例子任意改名了一些东西,所以它可能没有太大的逻辑意义;我只是希望它有足够的语法意义来帮助其他人解决同样的问题:)