ไม่สามารถส่งวิธีการขยายแบบไดนามิกได้


114

ฉันต้องการมี DropDownListFor ใน 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" })   
}

ในตัวควบคุม

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
มันบอกว่าไม่สามารถแปลงประเภท 'string' เป็น 'int'
nnmmss

3
@nnmmss แล้ว ViewBag.MagNo ไม่ใช่ int แต่เป็นสตริง ทิ้งให้สตริงและคุณควรจะสีทอง
รูปปั้น

คำตอบนี้ไม่ได้กล่าวถึงปัญหาที่แท้จริง - โค้ดทำงานในโปรเจ็กต์อื่น ๆ โดยไม่ต้องแคสต์ แต่ไม่ใช่ในของเขา - อาจมีการกำหนดค่าบางอย่างหายไปและทำให้คอมไพเลอร์สับสน - แก้ไข: ดูเหมือนว่าคำตอบของ @ mkaj จะกล่าวถึงปัญหาที่แท้จริง
BrainSlugs83

ฉันสามารถแคสต์ViewBag.MagNoเป็นbool?ประเภทได้หรือไม่?
Dylan Czenski

ฉันกำลังส่งจำนวนเต็ม สิ่งที่ฉันทำ (สตริง) ViewBag.MyNumber ToString () เพียงแค่เพิ่ม ToString () หรือ (string) จะแสดงข้อยกเว้น ใช่ฉันพบว่ามันแปลกเหมือนกัน
SZT

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.