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
」という名前の適用可能なメソッドはありませんが、その名前による拡張メソッドがあるようです。拡張メソッドを動的にディスパッチすることはできません。拡張メソッド構文を使用せずに、動的引数をキャストするか、拡張メソッドを呼び出すことを検討してください。
エラーを理解できません。何をチェックする必要がありますか?
拡張メソッドで動的タイプを使用していますが、これはサポートされていません。
動的型を実際の型にキャストすると、機能します。
私が今見ているものから、私は言うだろう:
(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" })
}
この問題に対する私の修正は以下を追加することでした:
@model MyModel
部分コントロールの上部。私はそれを忘れていました。
MVC拡張メソッドのテーマ(この質問に出くわした方法)を拡張するには、結果をIEnumerable<dynamic>
として返すDapperのconnection.Query()
構文を使用します。
次の方法で動的オブジェクトを使用することもできます。
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)