Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC 3 - Scaffolding drop down list

I am playing with the Scaffolding that is in Asp.net mvc

I have a property on my view model for countries

public IEnumerable<SelectListItem> Countries { get; set; }

Yet, when I create a view and specify the viewmodel it doesn't scaffold a drop down list as I expected it to. In fact it get completely ignored.

I have compiled the project before doing it

I also tried adding a property like this

public int CountryId { get; set; }

As this article suggested there is a convention at work

http://blog.stevensanderson.com/2011/01/28/mvcscaffolding-one-to-many-relationships/

I am using the Add view option you have when right clicking in a controller action method

Any ideas what is wrong?

like image 765
ChrisCa Avatar asked Apr 17 '11 10:04

ChrisCa


1 Answers

In my current project, i faced this problem and couldn't find a quick way to scaffold the Dropdown list of a one-many relation inside one of my Entities.

What I ended up doing was like the following:

1- Create the normal AddView=>Create way.

2- If i had a ID property in my model class, the defaul;t template will generate something like this to represent this property in my view:

<div class="editor-label">
                @Html.LabelFor(model => model.CityID)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.CityID)
                @Html.ValidationMessageFor(model => model.CityID)
</div>

3- Now I need to replace this default template with a working one, so I wrote this code in the CREATE method:

IEnumerable<SelectListItem> cityItems = dataContext.Cities.AsEnumerable().Select(c => new SelectListItem()
            {
                Text = c.Name,
                Value = c.ID.ToString(),
                Selected = false,
            });
            SelectList cityList = new SelectList(cityItems, "Value", "Text");
            ViewBag.CityList = cityList;

this will fetch the Cities table and create a Selectlist that i can pass to my view and work with it to provide the DrobDown with it's items.

4- replace the default code in my View by one like the following:

<div class="Post-label">
                        <div class="editor-label">
                            @Html.LabelFor(model => model.CityID)
                        </div>
                        <div class="editor-field">
                          @Html.DropDownListFor(m => m.CityID, ViewData["CityList"] as SelectList)
                            @Html.ValidationMessageFor(model => model.CityID)
                        </div>
</div>

The reason I've used ViewData["CityList"] instead of ViewBag.CityList is that this one worked but the other not.

5- now my view is working find and is fetching the City data just like what I expected, and using the same model inside my Edit view resulted in a working one too.

Give it a try and let me know what happened, Thanks.

like image 116
Mohammed Swillam Avatar answered Sep 21 '22 15:09

Mohammed Swillam