'আমার কী' কীটি থাকা ভিউডেটা আইটেমটি 'সিস্টেম.স্ট্রিং' টাইপের হলেও 'আইনিউবারেবল <সিলেক্টলিস্ট আইটেম>' টাইপ হওয়া উচিত


142

আমি এএসপি.নেট এমভিসি 2 ব্যবহার করে লিনক -2-এসকিউএল ম্যাপযুক্ত একটি ডাটাবেস থেকে ড্রপডাউন তালিকাটি পপুল করার চেষ্টা করছি এবং এই ত্রুটিটি পেতে থাকি।

আমি খুব বিভ্রান্ত হয়ে পড়েছি কারণ আমি IEnumerable<SelectListItem>দ্বিতীয় লাইনে টাইপের একটি ভেরিয়েবল ঘোষণা করছি তবে ত্রুটিটি আমাকে ভাবায় যে এটি কেস নয়। আমি মনে করি এটি খুব সহজ হওয়া উচিত, তবে আমি লড়াই করছি। কোন সাহায্য প্রশংসা করা হয়।

আমার নিয়ামকের আকর্ষণীয় বিটগুলি এখানে:

public ActionResult Create()
{
    var db = new DB();
    IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
        b => new SelectListItem { Value = b.basetype, Text = b.basetype });
    ViewData["basetype"] = basetypes;
    return View();
}

এবং এখানে আমার দর্শন আকর্ষণীয় বিটস:

<div class="editor-label">
   <%: Html.LabelFor(model => model.basetype) %>
</div>
<div class="editor-field">
   <%: Html.DropDownList("basetype") %>
   <%: Html.ValidationMessageFor(model => model.basetype) %>
</div>

ফর্মটি জমা দেওয়ার সময় এখানে পোস্ট পোস্ট রয়েছে

// POST: /Meals/Create
[HttpPost]
public ActionResult Create(Meal meal)
{
    if (ModelState.IsValid)
    {
        try
        {
            // TODO: Add insert logic here
            var db = new DB();
            db.Meals.InsertOnSubmit(meal);
            db.SubmitChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View(meal);
        }
    }
    else
    {
        return View(meal);
    }
}

ধন্যবাদ।


1
ড্রপডাউন তালিকাটি ঠিক সূক্ষ্ম দর্শনায় প্রদর্শিত হবে। এটি ডাটাবেস থেকে যেমনটি হওয়া উচিত তেমন পপুলেশন হয় তবে আমি ফর্মটি পোস্ট করি যখন আমি এই ত্রুটিগুলি পাই।
জেবিবস

6
গৃহীত উত্তরের সংক্ষিপ্তসার: নিশ্চিত হয়ে নিন যে আপনি আপনার নিয়ামকের পেতে এবং পোস্ট ক্রিয়াকলাপে উভয়ই তালিকাটি জনপ্রিয় করেছেন। এটি করা ভুলে যাওয়া সহজ, এবং এরপরে আরও জটিল বাগের অনুসন্ধানে সময় নষ্ট করা শেষ।
অ্যাডাম টলি

উত্তর:


208

আমারও একই সমস্যা ছিল এবং অবশেষে আমি উত্তর পেয়েছি ...

সমস্যাটি হ'ল পোস্ট পোস্টে ফর্মটি জমা দেওয়ার পরে, মডেলস্টেটটি বৈধ নয়, বা এটি চেষ্টা / ধরার ক্ষেত্রে ত্রুটি ধরা পড়েছে, সুতরাং দেখুনটি ফিরে এসেছে। তবে এবার ViewData["basetype"]ভিউটি সঠিকভাবে সেট হয়নি।

আপনার এটি আবার তৈরি করা দরকার, সম্ভবত আগে ব্যবহৃত একই কোড সহ, তাই এটি পুনরাবৃত্তি করুন:

var db = new DB();
IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
    b => new SelectListItem { Value = b.basetype, Text = b.basetype });
ViewData["basetype"] = basetypes;

সামনে return View(meal)[HttpPost]পদ্ধতি।

ঠিক এটি আপনার সমস্যার সমাধান করবে:

[HttpPost]
public ActionResult Create(Meal meal)
{
    if (ModelState.IsValid)
    {
        try
        {
            // TODO: Add insert logic here
            var db = new DB();
            db.Meals.InsertOnSubmit(meal);
            db.SubmitChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            var db = new DB();
            IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
               b => new SelectListItem { Value = b.basetype, Text = b.basetype });
            ViewData["basetype"] = basetypes;
            return View(meal);
        }
    }
    else
    {
        var db = new DB();
        IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
            b => new SelectListItem { Value = b.basetype, Text = b.basetype });
        ViewData["basetype"] = basetypes;
        return View(meal);
    }
}

আমি জানি এই প্রশ্নটি অনেক পুরানো, তবে আমি আজ এখানে একই সমস্যা নিয়ে এসেছি, যাতে অন্যরা পরে এখানে আসতে পারে ...


8
"এটি পুনরায় জনিত করুন" এর জন্য +1 ... আমার ভিউ মডেলগুলি রচনার জন্য আমার কাছে যথেষ্ট শক্তিশালী ব্যবস্থা রয়েছে তবে আমি এটির কল করতে সম্পূর্ণ ভুলে গিয়েছিলাম। সুতরাং, সম্পত্তিটি জনবহুল ছিল না এবং আমি চেষ্টা করুক না কেন আমি এটি (বরং দ্বিপাক্ষিক) বার্তাটি পেয়েছি।
টিম মেডোরা

8
আপনি যদি কোনও পোস্ট দেওয়ার আগে এটি পান তবে এটি নির্বাচনী তালিকায় কিছুই নেই বলে সবেমাত্র এটি খুঁজে পেয়েছেন।
মার্টিন

1
+1 কারণ আমি যখন সূচি পদ্ধতিতে আমার ভিউব্যাগটি সেট করেছিলাম তখন যখন আমি সত্যই এইচটিএমএল কল করেছিলাম অন্য ক্রিয়াকলাপের জন্য !!
সোয়াম্পিফক্স

ধন্যবাদ। এটি কেবল সংরক্ষণ করা থাকলে এটি চমৎকার হবে তবে আমি মনে করি এটি এমভিসি না হবে "উপায়"।
কেসি

যদি মডেলটি অবৈধ হয়ে যায় তবে আমি আসি ব্যবহারকারীর জমা দেওয়া ডেটা ডিবিতে সংরক্ষণ করা হবে? আমিও একই সমস্যায় পড়ছি। আমি একজন নবাগত আমি ভুল হলে আমাকে সংশোধন করুন
কৌশিক সাহা

87

যদি এই তালিকাটি বাতিল হয় তবে আপনি এই ত্রুটিটি পাবেন।


3
হ্যাঁ, আপনি যখন একটি জিইটি-তে সিলেক্টলিস্ট সেট আপ করেন তখন এটি একটি সাধারণ ত্রুটি / তদারকি হয় আপনি অবশ্যই ModelState.IsValid==falseমডেলটি ফিরিয়ে দেন return View(model) তবে পোষ্ট থেকে ফিরে আসার আগে আপনার নির্বাচনী তালিকা উত্সটি পুনরায় তৈরি করবেন না। যেহেতু কোনও ভিউস্টেট আলা ওয়েবফোর্ম নেই, @Html.DropDownসাহায্যকারীর সাহায্যে নির্বাচনগুলি পুনর্নির্মাণের কোনও উত্স নেই । আপনি কেবলমাত্র জিইটি-তে নয় ক্লায়েন্টের কাছে দৃশ্যটি ফিরিয়ে দেওয়ার প্রতিটি সময় আপনাকে সেই উত্সের তালিকা তৈরি করতে হবে।
রিজম

হ্যাঁ এই আমার সমস্যা ছিল। গেট কলটিতে নির্বাচিত তালিকাটি স্থাপন করতে ভুলে গেছেন। খুব বিভ্রান্তিকর ত্রুটি। দুর্দান্ত পোস্ট।
ম্যাট

3

আমি সবেমাত্র এই সমস্যাটি নিয়ে এসেছি এবং এই নিবন্ধটি এটির মাধ্যমে আমাকে সহায়তা করেছে - http://odetocode.com/Blogs/scott/archive/2010/01/18/DP-down-lists-and-asp-net-mvc। aspx

আপনার সংগ্রহটি পো এর পরে পুনরায় সজ্জিত হওয়ার কারণ সম্ভবত এটিই ঘটে


1

ভবিষ্যতের পাঠকদের জন্য, আপনি যদি রেজার ব্যবহার করছেন তবে তালিকা থেকে আইকনামেবলে সিলেক্টলিস্ট আইটেমের ধরণের পরিবর্তন করার চেষ্টা করুন।

থেকে

@Html.DropDownListFor(m => m.id, ViewBag.SomeList as List<SelectListItem>)

প্রতি

@Html.DropDownListFor(m => m.id, ViewBag.SomeList as IEnumerable<SelectListItem>)

0

প্রথম প্যারামিটার হিসাবে আপনার ড্রপডাউন তালিকার নামের জন্য একটি স্ট্রিং যুক্ত করার চেষ্টা করুন এবং আইটেমটি আপনার ভিউডেটা থেকে বের করুন:

 <%= Html.DropDownList("SomeDropdownName", (IEnumerable<SelectListItem>)ViewData["basetype"]) %>

এখানে আপনি একটি এক্সটেনশন পদ্ধতিও ব্যবহার করতে পারেন যাতে আপনি কীভাবে আপনার অন্যান্য নিয়ন্ত্রণগুলি সম্পন্ন করেছেন তার সাথে ড্রপডাউন তালিকাটি একই ধরণের স্টাইলে সেট আপ করা হয়:

        public static string DropDownList<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel)
        where TModel : class
    {
        string inputName = ExpressionHelper.GetInputName(expression);
        return htmlHelper.DropDownList(inputName, selectList, optionLabel);
    }

উদাহরণ স্বরূপ

<%= Html.DropDownList(x => x.BaseType, (IEnumerable<SelectListItem>)ViewData["basetype"], "")%>

0

আপনি সংগ্রহটি ভিউডাটা অভিধানে একটি আইটেম হিসাবে সেট করছেন এবং এটি মডেলটিতে সম্পত্তি হিসাবে পুনরুদ্ধার করার চেষ্টা করছেন। একটি সাধারণ ফিক্স হ'ল এটি সেটাকে ঠিক একইভাবে রেফারেন্স করা হবে:

    <%var basetype = ViewData["basetype"] as IEnumerable<SelectListItem>;%>
    <div class="editor-label">
        <%: Html.Label("basetype") %>
    </div>
    <div class="editor-field">
        <%: Html.DropDownList("basetype", basetype) %>
        <%: Html.ValidationMessage("basetype") %>
    </div>

বিকল্পভাবে, নীচের কোডটি দৃ strongly়ভাবে টাইপ করা ভিউ ব্যবহার করে:

public class ViewModel {
   //Model properties
   public IEnumerable<SelectListItem> basetype {get;set;}
}

public ActionResult Create()
    {
        var db = new DB();
        IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(b => new SelectListItem { Value = b.basetype, Text = b.basetype });
        return View(new ViewModel { basetype=basetypes });
    }

তারপরে, আপনার দৃ strongly়ভাবে টাইপ করা দৃশ্যে:

    <div class="editor-label">
        <%: Html.LabelFor(model => model.basetype) %>
    </div>
    <div class="editor-field">
        <%: Html.DropDownListFor(model=>model.basetype) %>
        <%: Html.ValidationMessageFor(model => model.basetype) %>
    </div>

আমি আপনার "সাধারণ ফিক্স" উদাহরণে কোডটি ব্যবহার করার চেষ্টা করেছি এবং একই ত্রুটি পেয়েছি। আমার উল্লেখ করা উচিত ছিল যে ড্রপডাউন তালিকাটি ভিউ ওকে পপুলিটেড করে, তবে আমি ফর্মটি জমা দেওয়ার পরে এই ত্রুটিটি পাই get
জবিবস

আপনি কি নিয়ন্ত্রক কর্মের জন্য কোড পোস্ট করতে পারেন যা ফর্ম জমা দেওয়ার কাজ পরিচালনা করে?
ইগোর জাভাকা

অবশ্যই, আমি এটি মূল পোস্টে যুক্ত করব। এ পর্যন্ত আপনার সাহায্যের জন্য ধন্যবাদ।
জবিবস

0

আপনি যদি ব্যবহার Html.DropDownList() পদ্ধতিটি - একই সাথে ত্রুটি ঘটতে পারে, যদি আপনার ভিউটাটা / ভিউব্যাগ আইটেমটি সেট না করা হয়, যেমন @ পেটো উত্তর দিয়েছিল।

কন্ট্রোলার সেট আইটেমটি সঠিকভাবে সেট করা না গেলেও মূল দৃষ্টিতে আপনি নতুন ভিউডাটাডিয়েশনারি মানগুলির সাথে আংশিক viw কল ব্যবহার করেন।

যদি আপনার @Html.Partial("Partianame", Model,new ViewDataDictionary() { /* ... */ })তখন থাকে তবে আপনার আংশিক দৃষ্টিভঙ্গি ViewDataএবং ViewBagডেটা দেখতে পাবে না , new ViewDataDictionary()প্যারামিটারটি সরিয়ে ফেলুন


0

ভবিষ্যতের পাঠকদের জন্য,

আমি আজ সমস্যাটি নিয়ে এসেছি এবং এটি ঠিক করতে পারি না। এটি সর্বোপরি সত্যই সহজ হয়ে উঠেছে। আমি একটি টেবিল + ভিউ নিয়ে কাজ করছিলাম। আমি যখন টেবিলটি আপডেট করেছি (কয়েকটি কলম যুক্ত করেছি) তখন আমি ভিউটি আপডেট (ড্রপ এবং পুনরায় তৈরি) করতে ভুলে গিয়েছিলাম, যা আমার জন্য সমস্যা তৈরি করেছিল। আশা করি এটি কারও সাহায্য করবে।


0

আমি আজ একই ত্রুটি পেয়েছি এবং আমার সমাধান হ'ল মডেলটিকে "বৈধ" করা।

আমার ক্ষেত্রে, ব্যবহারকারী "সংরক্ষণ করুন" ক্লিক করে জমা দেওয়ার পরে, আমি মডেল অবস্থা পেয়েছি: ব্যবহারকারী কী-ইন "0" হলে অবৈধ, তবে ব্যবহারকারী কী-ইন "0.0" হলে মডেল রাষ্ট্র বৈধ হবে be

তাই সত্যিকারের ব্যবহারকারী কী-ইন "0" ফিরিয়ে আনতে আমি "ইসওয়ালিড" পদ্ধতিটি ওভাররাইড করি।

আশা করি এটা সাহায্য করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.