विस्तार विधियों को गतिशील रूप से नहीं भेजा जा सकता है


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 नहीं है, बल्कि एक स्ट्रिंग है। इसे एक स्ट्रिंग में बांधें और आपको
बेस

यह उत्तर वास्तव में वास्तविक मुद्दे को संबोधित नहीं करता है - कोड कास्टिंग के बिना अन्य परियोजनाओं में काम करता है, बस उसकी नहीं - संभावना है कि कुछ कॉन्फ़िगरेशन गायब है और यह संकलक को भ्रमित करने का कारण बन रहा है। - संपादित करें: ऐसा लगता है कि @ mkaj का उत्तर वास्तविक समस्या को संबोधित करता है।
BrainSlugs83

क्या मैं ViewBag.MagNoएक bool?प्रकार से कास्ट कर सकता हूं ?
डायलन सीजेन्स्की

मैं एक पूर्णांक पास कर रहा था। मैंने क्या किया (स्ट्रिंग) ViewBag.MyNumber.ToString ()। बस ToString () या (string) को जोड़ने से अपवाद फेंकता है। याह मुझे अजीब लगा।
SZT

44

इस समस्या के लिए मेरा समाधान जोड़ना था:

    @model MyModel

आंशिक नियंत्रण के शीर्ष पर। मैं इसे भूल गया था।


धन्यवाद, मैं अपने विचारों को अन्य परियोजना में स्थानांतरित कर रहा था और मैं @model, thks भूल गया!
रोजशेड

3
यदि आप लोअरकेस मॉडल के बजाय uppercase @Model का उपयोग करते हैं, तो भी आपको यह त्रुटि मिलती है।
टिमोथी कांसकी

5

एमवीसी विस्तार के तरीकों के विषय पर विस्तार करने के लिए (जो कि इस सवाल को कैसे चलाया जाता है), मुझे डैपर का उपयोग करना पसंद है connection.Query() सिंटैक्स जो परिणाम रूप में लौटाएगा IEnumerable<dynamic>

इसके द्वारा गतिशील वस्तुओं का उपयोग करना भी संभव है:

  • जॉन स्कीट के उत्तर के अनुसार, स्टैटिक विधि को सीधे कॉल करना :

    @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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.