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"));
但是当我运行代码时,我得到了一行错误m => m.ID.给出的错误是:
表达式树可能不包含动态操作
我从来没有使用过这种类型的下拉菜单,对MVC来说也是新手.任何人都可以告诉我我做错了什么以及如何解决它?
我建议你的解决方案有一些变化:
1)而不是DropDownListFor()仅使用DropDownList()
@Html.DropDownList("CultureCode", new SelectList(db.CultureCodes, "ID", "DisplayName"))
2)而不是在您的视图中访问您的数据库数据...这是非常标准的,您将视图(通常是HTML)与数据库耦合......您应该将查询放在控制器中并将数据放入ViewBag集合.
因此,在您的布局中,而不是我上面建议的代码,您应该使用:
 @Html.DropDownList("CultureCode", (SelectList)ViewBag.Codes, "Select one...")
在您的控制器中,您按如下方式加载它:
 ViewBag.Codes = new SelectList(db.CultureCodes, "ID", "DisplayName"));
编辑: 
你可以做一个动作过滤器,加载或注入CultureCodes在ViewBag:
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"));;
        }
    }
}
然后,在你的Controller动作......你可以用它来装饰它们[IncludeCultureCodes].因此,具有该属性的操作将加载代码集合.
但我认为这是一种更好的方法来加载一次布局(例如Home/Index)然后使用局部视图.这样您只需重新加载布局回到家...或其他全视图调用.
| 归档时间: | 
 | 
| 查看次数: | 7166 次 | 
| 最近记录: |