我正在尝试使用 DropDownListFor<>
在我的 LayoutTemple 中,所以我无权访问模型。所以我所做的是在 @{}
在我添加的页面顶部阻止 FFInfo.DAL.SoloClassesContext db = new FFInfo.DAL.SoloClassesContext();
它使用我要使用的类调用 DBContext 的实例。然后我将列表放在我想要使用的地方
@Html.DropDownListFor(
m => m.ID,
new SelectList(db.CultureCodes, "ID", "DisplayName"));
但是当我运行代码时,我得到了 m => m.ID
行的错误.给出的错误是:
An expression tree may not contain a dynamic operation
我从未使用过这种类型的下拉菜单,对 MVC 还是个新手。谁能告诉我我做错了什么以及如何解决?
最佳答案
我建议对您的解决方案进行一些更改:
代替
DropDownListFor()
只使用DropDownList()
@Html.DropDownList("CultureCode", new SelectList(db.CultureCodes, "ID", "DisplayName"))
与其在您的 View 中访问您的数据库数据...这非常不符合标准并且您将 View (通常是 HTML)与数据库耦合...您应该将查询放在您的 Controller 中并且将数据放入 ViewBag 集合。
因此,在您的布局中,您应该使用:
@Html.DropDownList("CultureCode", (SelectList)ViewBag.Codes, "Select one...")
在你的 Controller 中你加载它如下:
ViewBag.Codes = new SelectList(db.CultureCodes, "ID", "DisplayName");
编辑:
你可以做一个 Action 过滤器,加载或注入(inject) 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 上)然后使用局部 View 是一种更好的方法。这样,您只需重新加载返回主页的布局...或其他全 View 调用。
关于c# - 尝试在没有模型出现 "tree may not contain dynamic operation"错误的情况下使用 DropDownListFor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19346122/