18

I wanted to create an editor template for a field type that is represented as a dropdownlist. In the definition of the editor template I would like to populate the DropDownList using a call to an action on the controller returning the results as JSON - Any ideas how to do this?

E.g something like:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<TheFieldType>" %>
<%= Html.DropDownList(.....
UpTheCreek
  • 31,444
  • 34
  • 152
  • 221
  • Sounds like a job for an extension method on the HtmlHelper which takes a controller method etc. What have you got so far? – bzlm Sep 30 '10 at 12:09

2 Answers2

65

In the editor template provide an empty dropdown:

<%= Html.DropDownListFor(
    x => x.PropertyToHoldSelectedValue, 
    Enumerable.Empty<SelectListItem>(), 
    "-- Loading Values --",
    new { id = "foo" }) 
%>

Then setup a controller action that will return the values:

public class FooController: Controller
{
    public ActionResult Index()
    {
        return Json(new[] {
            new { Id = 1, Value = "value 1" },
            new { Id = 2, Value = "value 2" },
            new { Id = 3, Value = "value 3" },
        }, JsonRequestBehavior.AllowGet);
    }
}

And then populate the values using AJAX:

$(function() {
    $.getJSON('/foo/index', function(result) {
        var ddl = $('#foo');
        ddl.empty();
        $(result).each(function() {
            $(document.createElement('option'))
                .attr('value', this.Id)
                .text(this.Value)
                .appendTo(ddl);
        });
    });
});
Darin Dimitrov
  • 1,023,142
  • 271
  • 3,287
  • 2,928
2

I know this post is a few years old but I found it and so might you. I use the following solution and it works very well. Strong typed without the need to write a single line of Javascript.

mvc4ajaxdropdownlist.codeplex.com

You can download it via Visual Studio as a NuGet package.