Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I reuse a DropDownList in several views with .NET MVC

Several views from my project have the same dropdownlist...

So, in the ViewModel from that view I have :

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

And in the controller I have :

var MyVM = new MyVM() {
    FooDdl = fooRepository.GetAll().ToSelectList(x => x.Id, x => x.Name)
}

So far so good... But I´m doing the same code in every view/controller that have that ddl...

Is that the best way to do that?

Thanks

like image 892
Paul Avatar asked Oct 02 '13 19:10

Paul


People also ask

What is cascading DropDownList in asp net?

A cascading drop-down list is a series of dependent DropDownList controls in which one DropDownList control depends on the parent or previous DropDownList controls. The items in the DropDownList control are populated based on an item that is selected by the user from another DropDownList control.

How bind dropdown from database in MVC?

For that add a View by right-clicking inside ActionResult and select AddView and provide its name as Index. After adding the View add a Namespace to the Model as shown below. Here we can directly access the MobileList from the Model. Now just run the application and just check it.


2 Answers

I'd say that's fine to be honest, as it's only a repeat of a few lines of code. If it's really bothering you though, you could have all your controllers inherit from a BaseController (if they don't already) and store a method in there to get them all, something like:

public IEnumerable<SelectListItem> GetFoos()
{
    return fooRepository.GetAll().ToSelectList(x => x.Id, x => x.Name);
}

Then in your controllers you could do:

var MyVM = new MyVM() {
    FooDdl = GetFoos()
}
like image 77
mattytommo Avatar answered Oct 04 '22 12:10

mattytommo


If your DropDownList is exactly the same the approach I would use is:

1) In your Base Controller or in a Helper class, you can create a method that returns a SelectList. That method should receive a nullabe int to get the select list with a value pre selected.

2) It is wise to cache the information you list in the DDL, to not query the database too often.

So, for (1):

public SelectList GetMyDDLData(int? selectedValue){
    var data = fooRepository.GetAll().Select(x => new { Value = x.Id, Text = x.Name });
    return new SelectList(data, "Id","Name", selectedValue);
}

In the view model:

var myVM = new MyVM();
myVM.DDLData = this.GetMyDDLData(null) // if it is in your BaseController.
myVM.DDLData = YourHelperClass.GetMyDDLData(null) // if it is in a helper static class

In your views:

@Html.DropDownListFor(x => x.FooProp, Model.DDLData, "Select one...")

For number (2):

private IEnumerable<YourModel> GetMyData()
{
    var dataItems = HttpContext.Cache["someKey"] as IEnumerable<YourModel>;
    if (dataItems == null)
    {
        // nothing in the cache => we perform some expensive query to fetch the result
        dataItems = fooRepository.GetAll().Select(x => new YourModel(){ Value = x.Id, Text = x.Name };

        // and we cache it so that the next time we don't need to perform the query
        HttpContext.Cache["someKey"] = dataItems ;
    }

    return dataItems;
}

The "someKey" could be something specific and static is this data is the same to all users, or you can do "someKey" + User.Id if the data is specific to one user.

If your repository is an abstractin layer (not directly EntityFramework) you can place this code there.

like image 40
Romias Avatar answered Oct 04 '22 11:10

Romias