আমরা যদি মনে করি না যে এটি কোনও বাগটি ঠিক করা উচিত, তবে ইজারাতে এমএসডিএন ডকুমেন্টটি উন্নত করবে। বিভ্রান্তিকর সত্যই এর খারাপ দস্তাবেজ থেকে আসে। ইন দুটিই MSDN , এটা পরামিতি ব্যাখ্যা নাম , যেমন
Type: System.String
The name of the form field to return.
এর অর্থ হ'ল এটি যে চূড়ান্ত এইচটিএমএল তৈরি করে তা সেই পরামিতিটি নির্বাচন করা ইনপুটটির নাম হিসাবে ব্যবহার করবে। কিন্তু, এটি আসলে এর চেয়ে বেশি বোঝায়।
আমার ধারণা ডিজাইনার ধারণা করে যে ব্যবহারকারীরা ড্রপডাউনলিস্ট প্রদর্শনের জন্য একটি ভিউ মডেল ব্যবহার করবে, একই পোস্টে ফিরে একই ভিউ মডেলটি ব্যবহার করবে । তবে অনেক ক্ষেত্রেই আমরা এই ধারণাকে সত্যই অনুসরণ করি না।
উপরের উদাহরণটি ব্যবহার করুন,
public class Person {
public int Id { get; set; }
public string Name { get; set; }
}
আমরা যদি অনুমানটি অনুসরণ করি তবে আমাদের এই ড্রপডাউনলিস্ট সম্পর্কিত দৃশ্যের জন্য একটি ভিউ মডেল নির্ধারণ করা উচিত
public class PersonsSelectViewModel{
public string SelectedPersonId,
public List<SelectListItem> Persons;
}
কারণ যখন পোস্ট ফিরে আসবে, কেবলমাত্র নির্বাচিত মানটি আবার পোস্ট করবে, সুতরাং এটি ধরে নিয়েছে এটি মডেলের সম্পত্তি সিলেক্টডপারসনআইডি-তে ফিরে পোস্ট করা উচিত, যার অর্থ এইচটিএমএল.ড্রপডাউনলিস্টের প্রথম প্যারামিটারের নাম ' ' হওয়া উচিত। সুতরাং, ডিজাইনার মনে করেন যে ভিউটিতে মডেল ভিউটি প্রদর্শন করার সময়, মডেলের সম্পত্তি SelectedPersonId এর সেই ড্রপডাউন তালিকার ডিফল্ট মান রাখা উচিত। এমনকি আপনার তালিকার <সलेक्टলিস্ট আইটেম> ব্যক্তিরা ইতিমধ্যে নির্বাচিত পতাকাটি সেট করে যা কোনটি নির্বাচিত / ডিফল্ট হয়েছে তা নির্ধারণ করে ভেবেছিল, টিএমএল.ড্রপডাউনলিস্ট আসলে এটিকে উপেক্ষা করবে এবং এটির নিজের পুনঃনির্মাণ করবে আইএনউমেবল <সিলেক্টলিস্ট আইটেম> এবং নামের ভিত্তিতে ডিফল্ট / নির্বাচিত আইটেমটি সেট করবে।
Asp.net এমভিসি থেকে কোড এখানে
private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, ModelMetadata metadata,
string optionLabel, string name, IEnumerable<SelectListItem> selectList, bool allowMultiple,
IDictionary<string, object> htmlAttributes)
{
...
bool usedViewData = false;
// 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;
}
object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName, typeof(string[])) : htmlHelper.GetModelStateValue(fullName, typeof(string));
// If we haven't already used ViewData to get the entire list of items then we need to
// use the ViewData-supplied value before using the parameter-supplied value.
if (defaultValue == null && !String.IsNullOrEmpty(name))
{
if (!usedViewData)
{
defaultValue = htmlHelper.ViewData.Eval(name);
}
else if (metadata != null)
{
defaultValue = metadata.Model;
}
}
if (defaultValue != null)
{
selectList = GetSelectListWithDefaultValue(selectList, defaultValue, allowMultiple);
}
...
return tagBuilder.ToMvcHtmlString(TagRenderMode.Normal);
}
সুতরাং, কোডটি আসলে আরও এগিয়ে গেছে, এটি কেবল মডেলটিতেই নামটি দেখার চেষ্টা করে না, তবে ভিউডেটাতেও এটি খুঁজে পাওয়ার সাথে সাথে এটি নির্বাচিত তালিকাটি পুনর্নির্মাণ করবে এবং আপনার মূল নির্বাচিতটিকে উপেক্ষা করবে।
সমস্যাটি হ'ল, অনেক ক্ষেত্রে আমরা সত্যিই সেভাবে ব্যবহার করি না। আমরা কেবলমাত্র এক / একাধিক আইটেম (গুলি) দিয়ে নির্বাচিত সেটটিকে সত্য দিয়ে একটি নির্বাচন তালিকাতে ফেলে দিতে চাই।
অবশ্যই সমাধানটি সহজ, এমন একটি নাম ব্যবহার করুন যা মডেল বা ভিউডেটাতে নয়। যখন এটি কোনও মিল খুঁজে পাবে না, এটি আসল সিলেক্টলিস্টটি ব্যবহার করবে এবং মূল নির্বাচিত প্রভাব ফেলবে।
তবে আমি এখনও মনে করি এমভিসি আরও একটি শর্ত যুক্ত করে এটি উন্নত করা উচিত
if ((defaultValue != null) && (!selectList.Any(i=>i.Selected)))
{
selectList = GetSelectListWithDefaultValue(selectList, defaultValue, allowMultiple);
}
কারণ, যদি মূল সিলেক্টলিস্টটিতে ইতিমধ্যে একটি নির্বাচিত থাকে তবে আপনি কেন এটিকে উপেক্ষা করবেন?
শুধু আমার চিন্তা।