我想在MVC中使用DropDownListFor
@foreach (var item in Model)
{
@Html.DropDownListFor(modelItem => item.TitleIds, new SelectList(ViewBag.TitleNames as System.Collections.IEnumerable, "TitleId", "Title.TitleText"), "No: " + ViewBag.MagNo, new { id = "TitleIds" })
}
控制器中的
public ActionResult ArticleList(int id)
{
ArticleWriter_ViewModel viewModel = new ArticleWriter_ViewModel();
Func<IQueryable<NumberTitle>, IOrderedQueryable<NumberTitle>> orderByFunc = null;
Expression<Func<NumberTitle, bool>> filterExpr = null;
if (id > 0)
{
filterExpr = p => p.MagazineId.Equals(id);
}
var wholeTitles = unitOfWork.NumberTitleRepository.Get(filterExpr, orderByFunc, "Magazine,Title").ToList();
ViewBag.MagNo = wholeTitles[0].Magazine.MagNo.ToString();
ViewBag.MagId = wholeTitles[0].Magazine.Id;
ViewBag.TitleNames = wholeTitles;
return View("../Panel/Magazine/ArticleList", "_BasicLayout", viewModel);
}
但我收到此错误
'
System.Web.Mvc.HtmlHelper<System.Collections.Generic.IEnumerable<Cinemavaadabiat.ViewModel.ArticleWriter_ViewModel>>
'没有名为“DropDownListFor
”的适用方法,但似乎有一个名称的扩展方法。无法动态分派扩展方法。考虑转换动态参数或调用扩展方法而不使用扩展方法语法。
我无法理解错误,我应该检查它是什么?
答案 0 :(得分:186)
您在扩展方法中使用动态类型,但不受支持。
将动态类型转换为实际类型,它将起作用。
从我现在看来,我会说:
(string) ViewBag.MagNo
哪会导致
@foreach (var item in Model)
{
@Html.DropDownListFor(modelItem => item.TitleIds,
new SelectList(ViewBag.TitleNames as System.Collections.IEnumerable,
"TitleId", "Title.TitleText"),
"No: " + (string) ViewBag.MagNo,
new { id = "TitleIds" })
}
答案 1 :(得分:41)
我对此问题的解决方法是添加:
@model MyModel
在部分控制的顶部。我忘了它。
答案 2 :(得分:4)
为了扩展MVC扩展方法的主题(这是我遇到这个问题的方式),我喜欢使用Dapper的connection.Query()
语法,它将结果作为IEnumerable<dynamic>
返回。
也可以通过以下方式使用动态对象:
根据Jon Skeet的answer直接调用静态方法:
@model IEnumerable<dynamic>
@PartialExtensions.Partial(Html, "~/link/to/_partialView.cshtml", Model)
将它包装在课堂上。
public class DynamicQueryResult
{
public dynamic QueryResults {get; set;}
}
然后在你的MVC视图中:
@model Namespace.DynamicQueryResult
@Html.Partial("~/link/to/_partialView.cshtml", Model)