PDA

View Full Version : سوال: نحوه استفاده از dropdownlist



speralda
سه شنبه 10 دی 1392, 10:25 صبح
درود دوستان

من نیاز دارم که یک dropdownlistدر view بزارم

این کارو هم انجام دادم ولی نمیدونم عملیات create و edit رو چجوری کد بزنم


در controller



public ActionResult Create()
{
List<ProductGroups> lstGroups;
lstGroups = db.ProductGroups.ToList();
ViewBag.GroupsList = lstGroups;
return View();
}


در view


@model Eshop_SportS.Models.Products
@{
ViewBag.Title = "Create";
Layout = "~/Views/Shared/_LayoutAdmin.cshtml";
}

....
...
<tr class="tr">
<td align="right" class="style2">
@Html.LabelFor(model => model.ProductGroups.ProductGroupTitle):
</td>
<td class="style3" rowspan="1">
@Html.DropDownListFor(model => model.ProductGroups.ProductGroupId, new SelectList(ViewBag.GroupsList, "ProductGroupId", "ProductGroupTitle"), "گروهی را انتخاب کنید")
</td>
</tr>
...
...


در model کلاس product


namespace Eshop_SportS.Models
{
public class Products
{
[Key]
[HiddenInput(DisplayValue = false)]
public int ProductId { set; get; }

[Display(Name = "نام محصول")]
[Required(ErrorMessage = "لطفا نام محصول را وارد نمایید")]
[StringLength(32)]
public string ProductTitle { set; get; }

[Display(Name = "توضیحات")]
[Required(ErrorMessage = "لطفا توضیحات را وارد نمایید")]
[StringLength(4000)]
public string ProductDescription { set; get; }

[Display(Name = "قیمت محصول")]
[Required(ErrorMessage = "لطفا قیمت محصول را وارد نمایید")]
public int ProductPrice { set; get; }

[Display(Name = "مسیر تصویر ")]
[StringLength(50)]
public string ProductImageUrl { set; get; }

public virtual ProductGroups ProductGroups { set; get; }
public List<OrderDetails> OrderDetails { set; get; }
}
}



در model کلاس ProductGroups


namespace Eshop_SportS.Models
{
public class ProductGroups
{
[Key]
[HiddenInput(DisplayValue = false)]
public int ProductGroupId { set; get; }

[Display(Name = "گروه محصول")]
[Required(ErrorMessage = "لطفا نامی برای گروه محصول وارد کنید")]
[StringLength(32)]
public string ProductGroupTitle { set; get; }

public List<Products> Products { set; get; }
}
}


ولی با این error برخورد میکنم

Value cannot be null.
Parameter name: items

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentNullException: Value cannot be null.
Parameter name: items

Source Error:

Line 47: </td> Line 48: <td class="style3" rowspan="1"> Line 49: @Html.DropDownListFor(model => model.ProductGroups.ProductGroupTitle, new SelectList(ViewBag.GroupsList, "ProductGroupId", "ProductGroupTitle"), "گروهی را انتخاب کنید") Line 50: </td> Line 51: </tr>

hakim22
سه شنبه 10 دی 1392, 17:57 عصر
شما نمیتوانید یک List را به SelectList تبدیل کنید. در متد Create بجای List از SelectList استفاده کنید.

sunn789
چهارشنبه 11 دی 1392, 14:17 عصر
اگر مودل رو درست طراحی کنید و زمان ایجاد کنترل برای ساخت ویوو از خود ام وی سی استفاده کنید نیاز به اینه خودت لیست باز شو ایجاد کنی نداری

speralda
پنج شنبه 12 دی 1392, 07:50 صبح
من توی نمایش محصول در dropdownlist مشکلی ندارم.
نمیدونم به چه نحوی creat [HttpPost] , edit رو بنویسم.


اگر مودل رو درست طراحی کنید و زمان ایجاد کنترل برای ساخت ویوو از خود ام وی سی استفاده کنید نیاز به اینه خودت لیست باز شو ایجاد کنی نداری

یعنی الان نوشتن model من ایراد داره؟



شما نمیتوانید یک List را به SelectList تبدیل کنید. در متد Create بجای List از SelectList استفاده کنید.
مرسی.به نتیجه نرسیدم

لطفا راهنمایی کنید دوستان.

Amir Oveisi
پنج شنبه 12 دی 1392, 14:06 عصر
وقتی که شما یک SelectList رو ایجاد میکنید، یک IEnumerable و دو تا string بهش میدید، اولی در واقع آیتم هایی هست که میخواید نمایش داده بشن توی لیست، دومی اسم property هست که قصد دارید بر اساس اون بفهمید چه آیتمی توسط کاربر انتخاب شده و سومی اسم property هست که میخواید مقدار اون property در آیتم های لیست نمایش داده بشه. مثال:

public async Task<ActionResult> Create()
{
ViewBag.Categories = new SelectList(await new CategoryRESTProvider().GetAllCategoriesAsync(), "Id", "Name");

}

در این مثال فرض کنید که یک کلاس به اسم Category وجود داره که یک Id و یک Name داره و ما قصد داریم Name اونها توی لیست نمایش داده بشه و هر آیتم که توسط کاربر انتخاب شد، Id اش به اکشن برگرده.
کد view:

<div class="control-group">
@Html.LabelFor(model => model.CategoryId, new { @class = "control-label" })

<div class="controls">
@Html.DropDownListFor(model => model.CategoryId, (SelectList)ViewBag.Categories, "Choose...", new { @class = "input-xlarge" })
@Html.ValidationMessageFor(model => model.CategoryId, null, new { @class = "help-inline" })
</div>
</div>

فزض کنید این view مربوط به فرم ورود اطلاعات برای یک Product هست و برای هر Product باید یک Category هم انتخاب بشه. بنابراین بین Product و Category رابطه وجود داره و کلاس Product یک property به اسم CategoryId داره که تو کد View با رنگ قرمز مشخص شده. حالا وقتی فرم مورد نظر submit بشه و اطلاعات فرم به صورت POST به اکشن مربوطه ارسال بشن، مقدار Id از Category انتخاب شده توی CategoryId اون Product مقداردهی میشه و همراه با model به اکشن ارسال میشه و اونجا میتونید به راحتی کارهای دیتابیسیش رو انجام بدید.

Amir Oveisi
پنج شنبه 12 دی 1392, 14:18 عصر
خطای کد شما فکر کنم به خاطر این هست که از ViewBag استفاده کردید اما cast اش نکردید. باید تو view اونجا که نوشتید ViewBag.GroupsList رو به (List<ProductGroups)ViewBag.GroupsList تغییر بدید

sunn789
جمعه 13 دی 1392, 21:40 عصر
یه کم ساده تر اینکه تو سایت asp,net اونجا که اموزش ساخت وب سایت موزیک داده اگه دقت منی یه ستون برای int اون لیست بازشو درست کنید و زمانی از ایجاد خودکار MVC استفاده کنی همه چیز رو خود MVC ایجاد میکنه
مثلاض این کد رو من برای Object درست کردم
[Display(Name = "مربوط به موضوع")]
[Required]
public int MainObjectID { get; set; }
[Display(Name = "مربوط به موضوع")]
public virtual MainObject MainObjects { get; set; }