확장 메서드는 동적으로 디스패치 할 수 없습니다.


114

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의 확장 메서드가있는 것 같습니다. 확장 메서드는 동적으로 디스패치 할 수 없습니다. 동적 인수를 캐스팅하거나 확장 메서드 구문없이 확장 메서드를 호출하는 것이 좋습니다.

오류를 이해할 수 없습니다. 무엇을 확인해야합니까?

답변:


199

지원되지 않는 확장 메서드에서 동적 유형을 사용하고 있습니다.

동적 유형을 실제 유형으로 캐스트하면 작동합니다.

내가 지금 본 것에서 나는 말하고 싶다.

(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" })   
}

2
이 캔은 'INT'로 유형 '문자열을'변환하지 말한다
nnmmss

3
@nnmmss 그러면 ViewBag.MagNo는 int가 아니라 문자열입니다. 그것을 현에 캐스팅하면 당신은 황금이되어야합니다
bas

이 답변은 실제 문제를 실제로 해결하지 않습니다. 코드는 그의 코드가 아닌 캐스팅없이 다른 프로젝트에서 작동합니다. 일부 구성이 누락되어 컴파일러가 혼란스러워 질 수 있습니다. -편집 : @mkaj의 답변이 실제 문제를 해결하는 것 같습니다.
BrainSlugs83

나는 캐스트 할 수 ViewBag.MagNoA와 bool?유형?
Dylan Czenski

정수를 전달했습니다. 내가 한 일은 (string) ViewBag.MyNumber.ToString (). ToString () 또는 (string)을 추가하면 예외가 발생합니다. 그래 나도 그게 이상하다는 것을 알았다.
SZT 2017-10-23

44

이 문제에 대한 수정 사항은 다음을 추가하는 것입니다.

    @model MyModel

부분 제어의 맨 위에 있습니다. 나는 그것을 잊었다.


감사합니다. 내 뷰를 다른 프로젝트로 마이그레이션하고 있었는데 @model을 잊어 버렸습니다.
rochasdv

3
소문자 모델 대신 대문자 @Model을 사용하는 경우에도이 오류가 발생합니다.
Timothy Kanski

5

MVC 확장 메서드의 주제를 확장하기 위해 (이 질문을 어떻게 처리했는지) connection.Query()결과를 반환하는 Dapper의 구문을 IEnumerable<dynamic>.

다음과 같은 방법으로 동적 개체를 사용할 수도 있습니다.

  • Jon Skeet의 답변에 따라 정적 메서드를 직접 호출합니다 .

    @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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.