سلام
من به صورت دستی یک دراپ دان لیست که از دیتابیس اطلاعات رو می خونه ایجاد کردم
این مدل هست
public class testGroup { [Key] public int ID { get; set; } public string Title { get; set; } public int ParentID { get; set; } }
این کد اکشن هست
public ActionResult Create() { IEnumerable<testGroup> mylist = db.Database.SqlQuery<testGroup>(@"select * from testGroups"); ViewBag.ParentID = new SelectList(mylist, "ID", "Title"); return View(); } // POST: Administrator/testGroups/Create // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "ID,Title,ParentID")] testGroup testGroup) { if (ModelState.IsValid) { db.testGroups.Add(testGroup); db.SaveChanges(); return RedirectToAction("Index"); } return View(testGroup); }
و این کد ویو
<select class="form-control" id="ParentID" name="ParentID"> @foreach (var item in ViewBag.ParentID) { <option value="@item.Value">@item.Text</option> } </select>
همونطور که می بینید یک System.Web.Mvc.SelectList به یک ViewBag به اسم ParentID پاس داده میشه
حالا می خوام بدونم mvc چطور متوجه می شه که کدوم آیتم از دراپ دان انتخاب شده، چون وقتی درج انجام میشه دقیقا و به درستی مقدار آیتم انتخاب شده رو به عنوان ParentID در دیتابیس ثبت می کنه.
قبلا که توسط هلپر html.dropdownlist این اتفاق صورت می گرفتم فکر می کردم در خود هلپر کدهایی نوشته شده که این قضیه رو مدیریت کنه، ولی الان که از این هلپر استفاده نکردم و توسط یک Foreach دراپ دان رو خودم ایجاد کردم می بینم باز همون اتفاق مدیریت شده، بنابراین احتمالا این مدیریت داره توسط System.Web.Mvc.SelectList انجام میشه ولی به چه نحو؟
ممنون میشم در این مورد توضیح بدید، واقعا گیج شدم!
هنگام شما یکی از item های DropDown را انتخاب می کنید در سمت Html آن item به نام selected نشانه گذاری می شود و زمانی که آن را به Controller ارسال می کنید تنها مقدار selected شده ارسال می شود، و برای دریافت هم به این شکل عمل می شود.
منظورتون از اینکه به selected نشانه گذاری میشه چیست؟
اگه منظورتون این هست
<option value="1" selected>test</option>
همچنین چیزی در View> Sorce دیده نمی شه.
و آپشن ها همه فقط دارای Value و Text هستن، برای هیچ کدوم selected مشاهده نمی شه.
بله همین طور است نباید مشاهده شود، هم از لحاظ امنیتی هم این که این مسئله توسط مرورگر مدیریت می شود.
میشه بیشتر مکانیسمش رو توضیح بدید؟
منظورتون از اینکه توسط مرورگر مدیریت میشه چیست؟
یعنی کجا این حالت نگهداری میشه؟ منظورتون کوکی هست؟
چون من بررسی کردم دیدم وقتی به جای System.Web.Mvc.SelectList یک لیست رو مستقیما پاس بدیم به ViewBag و دراپ دان رو به همون شکلی که گفتم به صورت دستی ایجاد کنیم دیگه مقدار انتخاب شده نگهداری نمیشه و باید خودمون اون رو مدیریت کنیم.
دوستان اگه این رو دقیق تر با جزئیات توضیح بدین ممنون میشم.
اگه فرضا بخواهیم یک Extenstion method برای html.dropdownlst بنویسیم دونستن جزئیات این مورد به نظر من الزامیه.
اینکار توسط ModelBinding در MVC اننجام میشه
وقتی شما آیتمی انتخاب میکنید یه فیلد شامل نام اون المان و Value انتخاب شده به سرور ارسال میشه و بعد ModelBinding مقدار را در Model قرار میده
بله
اون فضای نام فقط برای نمایش استفاده میشه
ببخشید، الان بدون پاس دادن لیست از طریق کنترلر و فقط به صورت دستی این کدها رو در ویو نوشتم و دیدم درج داره به درستی صورت می گیره و قضیه برام جا افتاد، هنوز جواب آخرتون رو ندیده بودم که سوالم رو پاک کردم.
<select class="form-control" id="ParentID" name="ParentID"> <option value="1">test</option> <option value="2">test2</option> <option value="3">5555555555</option> </select>
ممنون از راهنمایی.
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)