简体   繁体   中英

Html.ListBoxFor not selecting Items

Firstly I'm using MVC 2.0. I am having trouble getting a selection with a Multiselect listbox on the postback to my controller. Here is my Code:

Model

public class TestModel
{
    public MultiSelectList AvailableTestTypes { get; set; }
    public List<TestType> SelectedTestTypes { get; set; } 
}

public class TestType
{
   public long Id { get; set; }
   public string Name { get; set; }
   public bool isActive { get; set; }
}

Controller

public ActionResult Index(TestModel model)
{
    if (model == null) model = new TestModel();

    List<TestType> testList = new List<TestType>()
    {
        new TestType() { Id = 1, Name = "TESTING", isActive = true },
        new TestType() { Id = 2, Name = "TESTING2", isActive = true },
        new TestType() { Id = 3, Name = "TESTING3", isActive = true }
    };

    model.AvailableTestTypes = testList; //TODO: Fetch From Repository 
    return View(model);
}


[HttpPost]
public ActionResult PostForm(TestModel model)
{
    List<long> act = model.SelectedTestTypes != null ? model.SelectedTestTypes.Select(x => x.Id).ToList() : new List<long>();

View

 <%= Model != null && Model.AvailableTestTypes != null ?
                                    Html.ListBoxFor(x => x.SelectedTestTypes,
                                                             new MultiSelectList(Model.AvailableTestTypes, "Id", "Name", Model.SelectedTestTypes), 
                                                             new { @id = "testListboxId", @class = "blah", @title = "title" }) : null%>

After the Post to the Controller my Selected List count is 0 no matter how many I choose... What am I getting wrong here?

I tried a few different solutions such as Challenges with selecting values in ListBoxFor but nothing worked :(

The difference between your script and the example in the other script, is the fact that you're trying to bind to a List, instead of a int[].

When you want to populate a Multiselect Listbox, you will have to set a DataValueField and a DataTextfield, otherwise no value is set.

model.AvailableTestTypes = new MultiSelectList(testList, "Id", "Name);

Then try using this class:

public class TestModel
{
    public MultiSelectList AvailableTestTypes { get; set; }
    public int[] SelectedTestTypes { get; set; } 
}

In your PostForm action, you can use the Ids to retrieve the TestTypes.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM