Pergunta

Im using MVC 3 and Massive ORM.

I wondering how I could populate a dropdownlist using Massive ORM to get my data from the database.

I pass my list of categories to my view using ViewData["Categoreis"]. It passed the data to the view, but I get this errormessage when I try to load the page in my browser:

DataBinding: 'System.Dynamic.ExpandoObject' does not contain a property with the name 'CategoryID'.

This is how my dropdownlist looks like:

@Html.DropDownListFor(model => model.CategoryID, new SelectList(ViewData["Categories"] as IEnumerable<dynamic>, "CategoryID", "Name"), "--Category--")

Does anybody have a solution for my problem?

Foi útil?

Solução

I'm using Massive at the moment. Here's how I've populated a countries dropdown from a table in the database:

This is in my controller:

DetailsModel model = new DetailsModel();
var _countries = new Countries(); //Massive class
model.Countries = _countries.All().Select(x => new SelectListItem { Value = x.Id.ToString(), Text = x.Name });

Here is the Countries property that is inside my DetailsModel

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

In my view:

@Html.LabelFor(m => m.Country)
@Html.DropDownList("Country", Model.Countries)
@Html.ValidationMessageFor(m => m.Country)

Works like a charm for me.

Outras dicas

I it looks like there is a Massive method called KeyValues for this purpose. Currently it is line 360 in the source code. It returns a dictionary rather than an Expando. I assume you continue to use your Expando elsewhere in your code.

Here is the method signature:

/// This will return a string/object dictionary for dropdowns etc  
public virtual IDictionary<string, object> KeyValues(string orderBy = "") {...}

I pass my list of categories to my view using ViewData["Categoreis"]

I would recommend you to use models and forget about ViewData/ViewBag. For example define the following view model:

public class MyViewModel
{
    public int CategoryID { get; set; }
    public SelectList Categories { get; set; }
}

and in the controller populate the model and pass to the view:

public ActionResult Index()
{
    var categories = _repository.GetCategories();
    var model = new MyViewModel
    {
        // this assumes that categories is an IEnumerable<T>
        // where T is some domain model having CategoryID and Name properties
        Categories = new SelectList(categories, "CategoryID", "Name")
    };
    return View(model);
}

and finally in your strongly typed view:

@model MyViewModel
@Html.DropDownListFor(x => x.CategoryID, Model.Categories, "--Category--")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top