尝试使用DropDownListFor而不使模型获取"树可能不包含动态操作"错误

1 c# html.dropdownlistfor asp.net-mvc-4

我试图DropDownListFor<>在我的LayoutTemple中使用a ,所以我无法访问模型.所以我所做的是在@{}我添加的页面顶部的块中,FFInfo.DAL.SoloClassesContext db = new FFInfo.DAL.SoloClassesContext();它调用了我想要使用的类的DBContext实例.然后我把List放在我想要的地方

@Html.DropDownListFor(
m => m.ID,
new SelectList(db.CultureCodes, "ID", "DisplayName"));
Run Code Online (Sandbox Code Playgroud)

但是当我运行代码时,我得到了一行错误m => m.ID.给出的错误是:

表达式树可能不包含动态操作

我从来没有使用过这种类型的下拉菜单,对MVC来说也是新手.任何人都可以告诉我我做错了什么以及如何解决它?

Rom*_*ias 6

我建议你的解决方案有一些变化:

1)而不是DropDownListFor()仅使用DropDownList()

@Html.DropDownList("CultureCode", new SelectList(db.CultureCodes, "ID", "DisplayName"))
Run Code Online (Sandbox Code Playgroud)

2)而不是在您的视图中访问您的数据库数据...这是非常标准的,您将视图(通常是HTML)与数据库耦合......您应该将查询放在控制器中并将数据放入ViewBag集合.

因此,在您的布局中,而不是我上面建议的代码,您应该使用:

 @Html.DropDownList("CultureCode", (SelectList)ViewBag.Codes, "Select one...")
Run Code Online (Sandbox Code Playgroud)

在您的控制器中,您按如下方式加载它:

 ViewBag.Codes = new SelectList(db.CultureCodes, "ID", "DisplayName"));
Run Code Online (Sandbox Code Playgroud)

编辑: 你可以做一个动作过滤器,加载或注入CultureCodesViewBag:

public class IncludeCultureCodesAttribute : ActionFilterAttribute
{
        public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var controller = filterContext.Controller;

        // IController is not necessarily a Controller
        if (controller != null)
        {
            var db = new YourContext();
            controller.ViewBag.Codes = new SelectList(db.CultureCodes, "ID", "DisplayName"));;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在你的Controller动作......你可以用它来装饰它们[IncludeCultureCodes].因此,具有该属性的操作将加载代码集合.

但我认为这是一种更好的方法来加载一次布局(例如Home/Index)然后使用局部视图.这样您只需重新加载布局回到家...或其他全视图调用.