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


112

আমি নিম্নলিখিত ভিউ মডেল আছে

public class ProjectVM
{
    ....
    [Display(Name = "Category")]
    [Required(ErrorMessage = "Please select a category")]
    public int CategoryID { get; set; }
    public IEnumerable<SelectListItem> CategoryList { get; set; }
    ....
}

এবং একটি নতুন প্রকল্প তৈরি করতে এবং নিয়োগের জন্য নিম্নলিখিত কন্ট্রোলার পদ্ধতিটি Category

public ActionResult Create()
{
    ProjectVM model = new ProjectVM
    {
        CategoryList = new SelectList(db.Categories, "ID", "Name")
    }
    return View(model);
}

public ActionResult Create(ProjectVM model)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }
    // Save and redirect
}

এবং দেখুন

@model ProjectVM
....
@using (Html.BeginForm())
{
    ....
    @Html.LabelFor(m => m.CategoryID)
    @Html.DropDownListFor(m => m.CategoryID, Model.CategoryList, "-Please select-")
    @Html.ValidationMessageFor(m => m.CategoryID)
    ....
    <input type="submit" value="Create" />
}

দৃশ্যটি সঠিকভাবে প্রদর্শিত হয় তবে ফর্মটি জমা দেওয়ার সময় আমি নিম্নলিখিত ত্রুটি বার্তাটি পাই

অবৈধ অপারেশন এক্সসেপশন: ভিউডেটা আইটেমটির মূল কীটি 'ক্যাটাগরিআইডি' রয়েছে তা 'সিস্টেম.আইটি 32' টাইপের হলেও এটি অবশ্যই 'আইনিমেবল <সিলেক্টলিস্ট আইটেম>' টাইপ হওয়া উচিত।

একই ত্রুটিটি @Html.DropDownList()পদ্ধতিটি ব্যবহার করে ঘটে এবং আমি যদি একটি ViewBagবা ব্যবহার করে নির্বাচন তালিকাটি পাস করি ViewData

উত্তর:


108

ত্রুটির অর্থ হল এর মানটি CategoryList নাল (এবং ফলস্বরূপ DropDownListFor()পদ্ধতিটি প্রত্যাশা করে যে প্রথম প্যারামিটারটি টাইপযুক্ত IEnumerable<SelectListItem>)।

আপনি প্রতিটি প্রতিটি সম্পত্তি জন্য একটি ইনপুট উৎপাদিত নেই SelectListItemমধ্যে CategoryList(এবং না করা উচিত) যাতে কোন মান SelectListনিয়ামক পদ্ধতি পোস্ট করা হয়, সেইজন্য এবং মান model.CategoryListপোস্ট পদ্ধতি null। আপনি যদি ভিউটি ফিরিয়ে দেন তবে আপনাকে প্রথমে CategoryListজিইটি পদ্ধতিতে যেমন মানটি করা হয়েছে , তেমনি আপনাকে অবশ্যই পুনরায় মূল্য দিতে হবে ।

public ActionResult Create(ProjectVM model)
{
    if (!ModelState.IsValid)
    {
        model.CategoryList = new SelectList(db.Categories, "ID", "Name"); // add this
        return View(model);
    }
    // Save and redirect
}

অভ্যন্তরীণ কার্যকারিতা ব্যাখ্যা করতে (উত্স কোডটি এখানে দেখা যাবে )

প্রতিটি ওভারলোড DropDownList()এবং DropDownListFor()অবশেষে নিম্নলিখিত পদ্ধতিতে কল করে

private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, ModelMetadata metadata,
  string optionLabel, string name, IEnumerable<SelectListItem> selectList, bool allowMultiple,
  IDictionary<string, object> htmlAttributes)

selectList(দ্বিতীয় প্যারামিটার @Html.DropDownListFor()) হয় কিনা তা যাচাই করেnull

// If we got a null selectList, try to use ViewData to get the list of items.
if (selectList == null)
{
    selectList = htmlHelper.GetSelectData(name);
    usedViewData = true;
}

যা ঘুরে ফিরে কল

private static IEnumerable<SelectListItem> GetSelectData(this HtmlHelper htmlHelper, string name)

যা প্রথম প্যারামিটার মূল্যায়ণ করে @Html.DropDownListFor()(এই ক্ষেত্রে CategoryID)

....
o = htmlHelper.ViewData.Eval(name);
....
IEnumerable<SelectListItem> selectList = o as IEnumerable<SelectListItem>;
if (selectList == null)
{
    throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, 
        MvcResources.HtmlHelper_WrongSelectDataType,
        name, o.GetType().FullName, "IEnumerable<SelectListItem>"));
}

সম্পত্তি CategoryIDটাইপফুল হওয়ায় intএটি কাস্ট করা যায় না IEnumerable<SelectListItem>এবং ব্যতিক্রম নিক্ষেপ করা হয় (যা MvcResources.resxফাইল হিসাবে সংজ্ঞায়িত করা হয় )

<data name="HtmlHelper_WrongSelectDataType" xml:space="preserve">
    <value>The ViewData item that has the key '{0}' is of type '{1}' but must be of type '{2}'.</value>
</data>

8
@ শাইজু, হ্যাঁ, আমি এটিকে জিজ্ঞাসা করেছি এবং এর জবাব দিয়েছি (সম্প্রদায় উইকি হিসাবে) নিখুঁতভাবে এসও-তে অনুরূপ আরও অনেক অনুরূপ প্রশ্ন ডুপ-হ্যামার করার উদ্দেশ্যে যা উত্তরহীন বা অগ্রহণযোগ্য থেকে যায়। তবে আমি দেখতে পাচ্ছি প্রতিশোধের ভোটাররা ইতিমধ্যে শুরু করেছেন - পোস্টিংয়ের পরে প্রথমটি 2 সেকেন্ডেরও কম ছিল - এটি পড়ার জন্য পর্যাপ্ত সময়ও ছিল না উত্তরটি ছেড়ে দেওয়া হোক।

1
আমি দেখি. একই সমস্যা নিয়ে 100 টি প্রশ্ন রয়েছে। সাধারণত যারা প্রশ্নগুলি জিজ্ঞাসা করে তারা যথাযথ অনুসন্ধান করে না (বা তারা বিদ্যমান উত্তর শব্দের কপি করে পেস্ট করেছিল তবে কার্যকর হয়নি!) সুতরাং আমি নিশ্চিত নই যে এটি সত্যিই সাহায্য করবে। :) সুন্দরভাবে লেখা বিটিডাব্লু।
Shyju

@ স্টিফেন এটি সঠিকভাবে নয় যেভাবে আপনি জিজ্ঞাসা করছেন এবং আপনি উত্তর দিচ্ছেন
দিলীপ ওগানিয়া

8
@ দিলিপএন, আপনি সঠিক উপায়টি কী বোঝাতে চাইছেন না ? এটি সত্যই উত্সাহিত। আপনি পড়া উচিত এই এবং মেটা উপর কিছু সময় ব্যয়।

4
@ ডিলিপএন, কারণ আমি এটি অনুরূপ অসংখ্য অনুরূপ প্রশ্নের নকল হিসাবে চিহ্নিত করতে ব্যবহার করব যা হয় হয় উত্তরহীন রেখে গেছে, বা উত্তর দেওয়া হয়েছে তবে গ্রহণ করা হয়নি যাতে সেগুলি বন্ধ করে দেওয়া যায় (এবং অন্যরা তাদের সময় নষ্ট না করে)। আমি এটিকে একটি সম্প্রদায় উইকিও বানিয়েছি যাতে যে কেউ এটি সময়ের সাথে সাথে সম্পাদনা করতে এবং উন্নতি করতে পারে।

6

স্টিফেনের (ইউজার 3559349) উত্তর অনুসারে , এটি কার্যকর হতে পারে:

@Html.DropDownListFor(m => m.CategoryID, Model.CategoryList ?? new List<SelectListItem>(), "-Please select-")

বা প্রজেক্টভিএম এ:

public class ProjectVM
{
    public ProjectVM()
    {
        CategoryList = new List<SelectListItem>();
    }
    ...
}

1

আপনার পৃষ্ঠায় পুনঃনির্দেশিত করতে আপনি কোনও ধরণের ত্রুটির কারণ হয়েছিলেন এবং আপনি আবারও আপনার মডেলের ড্রপ ডাউন তালিকাগুলি আরম্ভ করছেন না।

নিশ্চিত হয়ে নিন যে আপনি আপনার ড্রপ ডাউনগুলি মডেলটির নির্মাণকারীর মধ্যে বা প্রতিটি বার পৃষ্ঠাটিতে মডেলটি প্রেরণের আগেই শুরু করেছিলেন।

অন্যথায় আপনাকে ভিউ ব্যাগের মাধ্যমে বা লুকানো মান সাহায্যকারীদের মাধ্যমে ড্রপ ডাউন তালিকার অবস্থা বজায় রাখতে হবে।


0

আমারও একই সমস্যা ছিল, আমি ফর্মটি পোস্ট করার চেষ্টা করার সময় আমি একটি অবৈধ মডেলস্টেট পাচ্ছিলাম। আমার জন্য, এটি বিভাগে আইডি সেট করার কারণে ঘটেছিল, যখন আমি এটিকে স্ট্রিংয়ে পরিবর্তন করি মডেলস্টেটটি বৈধ ছিল এবং তৈরি পদ্ধতিটি প্রত্যাশার মতো কাজ করেছিল।


0

ঠিক আছে, পোস্টারের ক্যানড উত্তরটি পরিষ্কার করে ব্যাখ্যা করেছে যে ত্রুটি কেন ঘটেছে, তবে কীভাবে এটি কাজ করা যায় তা নয়। আমি নিশ্চিত না যে এটি সত্যিই একটি উত্তর, তবে এটি আমাকে সঠিক দিকে নির্দেশ করেছে।

আমি একই ইস্যুতে দৌড়েছি এবং এটি সমাধান করার একটি চটজলদি উপায় খুঁজে পেয়েছি। আমি এখানে এটি ক্যাপচার চেষ্টা করব। দাবি অস্বীকার - আমি বছরে একবার ওয়েব পৃষ্ঠাগুলিতে কাজ করি এবং বেশিরভাগ সময় আমি কী করছি তা সত্যিই আমি জানি না। এই উত্তরটিকে কোনওভাবেই "বিশেষজ্ঞ" উত্তর হিসাবে বিবেচনা করা উচিত নয়, তবে এটি খুব কম কাজ করে ...

প্রদত্ত যে আমার কাছে কিছু ডেটা অবজেক্ট (সম্ভবত ডেটা স্থানান্তর অবজেক্ট) রয়েছে যা আমি কোনও ক্ষেত্রের জন্য বৈধ মান সরবরাহ করতে একটি ড্রপ-ডাউন তালিকা ব্যবহার করতে চাই:

public class MyDataObject
{
  public int id;
  public string StrValue;
}

তারপরে ভিউমোডেলটি এমন দেখাচ্ছে:

public class MyDataObjectVM
{
  public int id;

  public string StrValue;
  public List<SectListItem> strValues;
}

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

// GET
public ActionResult Create()
{
  var dataObjectVM = GetNewMyDataObjectVM();
  return View(dataObjectVM); // I use T4MVC, don't you?
}

private MyDataObjectVM GetNewMyDataObjectVM(MyDataObjectVM model = null)
{
  return new MyDataObjectVM
  {
    int id = model?.Id ?? 0,
    string StrValue = model?.StrValue ?? "", 
    var strValues = new List<SelectListItem> 
      { 
        new SelectListItem {Text = "Select", Value = ""},
        new SelectListITem {Text = "Item1", Value = "Item1"},
        new SelectListItem {Text = "Item2", Value = "Item2"}
      };
  };
}

// POST
public ActionResult Create(FormCollection formValues)
{
  var dataObject = new MyDataObject();

  try
  {
    UpdateModel(dataObject, formValues);
    AddObjectToObjectStore(dataObject);

    return RedirectToAction(Actions.Index);
  }
  catch (Exception ex)
  {
    // fill in the drop-down list for the view model
    var dataObjectVM = GetNewMyDataObjectVM();
    ModelState.AddModelError("", ex.Message);

    return View(dataObjectVM);
  )
}

ওখানে তোমার আছে। এটি কোডটি কাজ করছে না, এটি অনুলিপি করার জন্য আমি অনুলিপি / আটকানো এবং সম্পাদনা করেছি তবে আপনি ধারণাটি পেয়ে যান। যদি মূল ডেটা মডেল এবং উত্পন্ন ভিউ মডেল উভয়ের ডেটা সদস্যদের একই নাম হয়, তবে আপডেটমোডেল () ফর্ম সংগ্রহের মানগুলি থেকে আপনার জন্য সঠিক তথ্য পূরণ করার দুর্দান্ত কাজ করে।

আমি এটি এখানে পোস্ট করছি যাতে আমি অনিবার্যভাবে এই সমস্যাটি আবার চালাতে পারলে আমি উত্তরটি খুঁজে পেতে পারি - আশা করি এটি অন্য কাউকেও সহায়তা করবে।


0

আমার ক্ষেত্রে আমার তালিকার প্রথম আইডিটি শূন্য ছিল, একবার আমি আইডিটি পরিবর্তন করে 1 থেকে শুরু করেছিলাম, এটি কার্যকর হয়েছিল।

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