System.Web.Mvc.HtmlHelper不包含'DropDownListFor'的定义。

3

我遇到了一个运行时异常,如下所示。编译源代码没有显示任何问题。这个问题在@html.TextBoxFor()上没有发生,为什么DropDownListFor会出问题?

@Html.DropDownListFor(m => m.EView.EStatusId, @Model.EView.EStatus)
public class EView
{
    #region Constructor

    public EView()
    {
        this.EDataView = new EDataViewModel();
    }

    #endregion

    #region Properties

    public int EStatusId { get; set; }

    public EDataViewModel EDataView { get; set; }

    public IEnumerable<SelectListItem>  EStatus
    {
        get {
            SelectListItem item = null;
            List<SelectListItem> status = null;

            status = new List<SelectListItem>();
            item = new SelectListItem();

            item.Text = "Open";
            item.Value = "1";
            status.Add(item);

            item = new SelectListItem();

            item.Text = "Closed";
            item.Value = "2";
            status.Add(item);
            return status;
        }
    }

    #endregion
}

System.Web.Mvc.HtmlHelper<EApp.ViewModels.AdminViewModel>不包含DropDownListFor的定义,最好的扩展方法重载System.Web.Mvc.Html.SelectExtensions.DropDownListFor<TModel,TProperty>(System.Web.Mvc.HtmlHelper<TModel>, System.Linq.Expressions.Expression<System.Func<TModel,TProperty>>, System.Collections.Generic.IEnumerable<System.Web.Mvc.SelectListItem>)有一些无效的参数。


请展示一些代码! - Rahul Singh
你检查过我的答案了吗?我正在绑定下拉列表,考虑到你将 @model YourNamespace.EView 传递给视图,这对我来说很好用。请告诉我你传递给视图的是什么。 - Rahul Singh
3
我能够找出解决问题的办法。我的 ViewModel 没有引用 System.Web.Mvc 命名空间,而是使用了 System.Web.WebPages.Html 命名空间。缺少 System.Web.Mvc 命名空间导致了问题:“不包含 DropDownListFor 的定义和最佳的扩展方法重载”。。无论如何,感谢 Rahul 的帮助 :-) - Anish
2个回答

4

这个错误可能是由于使用了错误的SelectListItem类型引起的。当我在未解决的SelectListItem类型声明上按下Ctrl-.时,我误选了错误的命名空间。我选了System.Web.WebPages.Html而不是System.Web.Mvc。这导致了视图中半加密的运行时错误。解决方法是确保您在控制器、视图模型等中使用了正确的SelectListItem类型,可以通过在using语句中使用正确的命名空间或者根据需要完全限定SelectListItem类型来实现。(希望不需要完全限定...)


0
有点晚了,但是在Model.EView.EStatus前面去掉'@'怎么样?
所以:
@Html.DropDownListFor(m => m.EView.EStatusId, Model.EView.EStatus)

1
这一点并不重要。在C#上下文中(即在Razor中的初始@之后),at符号(@)用于转义违反C#语法的标识符,例如public class @class { }。您可以自由地将其前置到任何标识符。 - CodeCaster
谢谢CodeCaster。你是对的。我想我在考虑在花括号代码块之间使用“@”符号 - 即Razor不喜欢嵌套代码块本身。 - oflahero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接