Không thể gửi động các phương thức mở rộng


114

Tôi muốn có DropDownListFor trong MVC

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

trong Bộ điều khiển

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);
}

nhưng tôi gặp lỗi này

' System.Web.Mvc.HtmlHelper<System.Collections.Generic.IEnumerable<Cinemavaadabiat.ViewModel.ArticleWriter_ViewModel>>' không có phương pháp áp dụng nào có tên ' DropDownListFor' nhưng dường như có một phương thức mở rộng có tên đó. Không thể gửi động các phương thức mở rộng. Xem xét truyền các đối số động hoặc gọi phương thức mở rộng mà không có cú pháp phương thức mở rộng.

Tôi không thể hiểu được lỗi, tôi nên kiểm tra những gì?

Câu trả lời:


199

Bạn đang sử dụng các loại động trong các phương thức mở rộng không được hỗ trợ.

Truyền các loại động sang các loại thực tế và nó sẽ hoạt động.

Từ những gì tôi thấy bây giờ, tôi muốn nói:

(string) ViewBag.MagNo

Điều này sẽ dẫn đến

@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
nó nói không thể chuyển đổi loại 'string' thành 'int'
nnmmss

3
@nnmmss thì ViewBag.MagNo không phải là int, mà là một chuỗi. Truyền nó thành một chuỗi và bạn sẽ trở nên vàng
bas

Câu trả lời này không thực sự giải quyết được vấn đề thực sự - mã hoạt động trong các dự án khác mà không cần truyền, không phải trong mã của nó - có khả năng là có một số cấu hình bị thiếu và nó khiến trình biên dịch bị nhầm lẫn. - Chỉnh sửa: Có vẻ như câu trả lời của @ mkaj giải quyết vấn đề thực tế.
BrainSlugs83

Tôi có thể truyền ViewBag.MagNosang một bool?loại không?
Dylan Czenski

Tôi đã chuyển một số nguyên. Những gì tôi đã làm (chuỗi) ViewBag.MyNumber.ToString (). Chỉ cần thêm ToString () hoặc (chuỗi) sẽ ném ra ngoại lệ. Yah, tôi cũng thấy điều đó kỳ lạ.
SZT

44

Cách khắc phục của tôi cho vấn đề này là thêm:

    @model MyModel

Ở đầu kiểm soát một phần. Tôi đã quên nó.


Cảm ơn, tôi đang chuyển quan điểm của mình sang dự án khác và tôi quên @model, thks!
rochasdv

3
Bạn cũng gặp lỗi này nếu sử dụng @Model viết hoa thay vì mô hình viết thường.
Timothy Kanski

5

Để mở rộng về chủ đề của các phương thức mở rộng MVC (đó là cách tôi chạy qua câu hỏi này), tôi muốn sử dụng connection.Query()cú pháp Dapper sẽ trả về kết quả dưới dạngIEnumerable<dynamic> .

Cũng có thể sử dụng các đối tượng động bằng cách:

  • Gọi trực tiếp phương thức tĩnh, theo câu trả lời của Jon Skeet :

    @model IEnumerable<dynamic>
    
    @PartialExtensions.Partial(Html, "~/link/to/_partialView.cshtml", Model)
  • Gói nó trong một lớp.

    public class DynamicQueryResult
    {
        public dynamic QueryResults {get; set;}
    }

    Sau đó, trong Chế độ xem MVC của bạn:

    @model Namespace.DynamicQueryResult
    
    @Html.Partial("~/link/to/_partialView.cshtml", Model)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.