Search code examples
asp.net-mvc-4razorselectedvaluehtml.actionlinkhtml.listboxfor

ASP.NET MVC 4 - ListBoxFor, send selectedValue in ActionLink


I have a list of model. I want to retrieve the listBoxSelectedValue to send it in my actionLink to edit it.

This is my view :

@using (Html.BeginForm())
{
    @Html.ListBoxFor(a => a.SelectedApplis, new SelectList(ViewBag.Applis,"ID","Name", Model.SelectedApplis))<br/>
    @Html.ActionLink("Add","Create","Application")<br/>
    @Html.ActionLink("Edit","Edit","Application", null, new { listAppId = Model.SelectedApplis})<br/>
    @Html.ActionLink("Delete","Delete","Application")<br/>
}  

I created a class "ListBoxApplication" with the List which will contain the selectedValue of the ListBox.

public class ListBoxApplication
{
    public IEnumerable<int> SelectedApplis { get; set; }

    public ListBoxApplication()
    {
        SelectedApplis = new List<int>();
    }
}

I have 2 controllers : Application and Home

In HomeController, I created the model ListBoxApplication which contain the List. In my ViewBag.Applis, i have all my ApplicationModel.

    public ActionResult Index()
    {
        ListBoxApplication listeApplis = new ListBoxApplication();

        ViewBag.Applis = ApplicationModels.GetListApplications();
        return View(listeApplis);
    }

In my ApplicationController :

    public ActionResult Edit(ListBoxApplication listAppId)
    {
        // I WANT TO RETRIEVE MY listAppId HERE, but it is always 'null'
        return View();
    }

So I think my problem is in the actionLink :

@Html.ActionLink("Edit","Edit","Application", null, new { listAppId = Model.SelectedApplis})

Me Edit Method is not is the actual controller (Home/Index). I need to send the selectedValue of my ListBox in my actionLink to (Application/Edit).

The listAppId is always 'null'. It doesn't retrieve the value... Is there a mistake in my actionLink ?

Thanks for advance


Solution

  • I don't believe that action links will trigger a postback to the server. Try this instead:

        @Html.ActionLink("Delete","Delete","Application")<br/>
        @Html.ActionLink("Add","Create","Application")<br/>
    
        @using (Html.BeginForm("Detail","Application"))
        {
            @Html.ListBoxFor(a => a.SelectedApplis, new SelectList(ViewBag.Applis)) //not sure what the other params you had here were for, but it should work like this
            <br/>
            <input type="submit" name="Edit" value = "Edit"/>
            @*added in response to comment*@
            <input type="submit" name="Delete" value = "Delete"/>
            <input type="submit" name="Add" value = "Add"/>
        }  
    

    If you plan on having all of those buttons post back to the server, you could also use ajax (and javascript) to accomplish this same goal, without needing to write out a form for each individual button. Both ways would work just fine, multiple forms is technically easier though.

    public ActionResult Detail(ListBoxApplication listAppId, bool Edit, bool Add, bool Delete)
    {
        if(//check your bools here){
        }
        return View();
    }