0

Hi I'm new in MVC now working with dual listboxes. I wanted to move the data from listbox1 to listbox2. For that I'm using the following code:

View

<tbody>
    <tr>
        <td>
            <%:Html.HiddenFor(m=>m.objMemberAccessRights.Id) %>
            <%:Html.ListBoxFor(model =>model.objMemberAccessRights.AvailableSelected, newMultiSelectList(Model.objMemberAccessRights.AvailableNames, "Id", "InstituteName", Model.objMemberAccessRights.AvailableSelected), new { size="8"})%>
        </td>
        <td>
            <br/>
            <%:Html.ActionLink(">>", "AddNames", "MemberDetails") %>
            <br/>
            <br/>
            <%:Html.ActionLink("<<", "RemoveNames", "MemberDetails") %>
        </td>
        <td>
            <%:Html.ListBoxFor(model=>model.objMemberAccessRights.RequestedSelected,newMultiSelectList(Model.objMemberAccessRights.RequestedNames,"Id","InstituteName",Model.objMemberAccessRights.RequestedSelected), new { size="8"}) %>
        </td>
    </tr>
</tbody>

Controller

//
// GET: /MemberDetails/Create
public ActionResult Create()
{
    MemberDetailsWrapper MD = new MemberDetailsWrapper();
    MD.objMemberAccessRights = newMemberAccessRights{ AvailableNames = getAllInstituteNameList(), RequestedNames = new List<InstituteInformation>() };
    return View(MD);
}

//AddNames
public ActionResult AddNames(MemberDetailsWrapper MD, string add)
{
    ModelState.Clear();
    RestoreSavedState(MD);
    if (!add.Equals(">>"))
    {
        if (MD.objMemberAccessRights.AvailableSelected != null)
        {
            var names = getAllInstituteNameList().Where(p => MD.objMemberAccessRights.AvailableSelected.Contains(p.InstituteName));
            MD.objMemberAccessRights.RequestedNames.AddRange(names);
            MD.objMemberAccessRights.AvailableSelected = null;
        }
    }
    SaveState(MD);
    return View(MD);
}

//RemoveNames
public ActionResult RemoveNames(MemberDetailsWrapper MD, string remove)
{
    ModelState.Clear();
    RestoreSavedState(MD);
    if (!remove.Equals("<<"))
    {
        if (MD.objMemberAccessRights.RequestedSelected != null)
        {
            MD.objMemberAccessRights.RequestedNames.RemoveAll(p => MD.objMemberAccessRights.RequestedSelected.Contains(p.InstituteName));
            MD.objMemberAccessRights.RequestedSelected = null;
        }
        SaveState(MD);
        return View(MD);
    }

#regionSupportFuncs
public void SaveState(MemberDetailsWrapper MD)
{
    MD.objMemberAccessRights.SavedRequested = string.Join(",", MD.objMemberAccessRights.RequestedNames.Select(p =>p.InstituteName).ToArray());
    ////Available Names = All - Requested
    MD.objMemberAccessRights.AvailableNames = getAllInstituteNameList().Except(MD.objMemberAccessRights.RequestedNames).ToList();
}

//RestoreSavedState
public void RestoreSavedState(MemberDetailsWrapper MD)
{
    MD.objMemberAccessRights.RequestedNames = new List<InstituteInformation>();
    if (!string.IsNullOrEmpty(MD.objMemberAccessRights.SavedRequested))
    {
        string[] nameids = MD.objMemberAccessRights.SavedRequested.Split(',');
        var name = getAllInstituteNameList().Where(p =>nameids.Contains(p.InstituteName));
        MD.objMemberAccessRights.RequestedNames.AddRange(name);
    }
}
#endregion

In model:

public class InstituteInformation
{
    public int Id { get; set; }
    public string InstituteName { get; set; }
}

public class MemberAccessRights
{
    public int Id { get; set; }

    public List<InstituteInformation> AvailableNames { get; set; }
    public string[] AvailableSelected { get; set; }

    public List<InstituteInformation> RequestedNames { get; set; }
    public string[] RequestedSelected { get; set; }

    public string SavedRequested { get; set; }
}

Here When I click on >> button then this button returns the Error:

Object reference not set to an instance of an object. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:   
Line 170:   public void    RestoreSavedState(MemberDetailsWrapper MD)
Line 171:   { 
Line 172:       MD.objMemberAccessRights.RequestedNames = new List<InstituteInformation>();
Line 173:
Line 174:       if (!string.IsNullOrEmpty(MD.objMemberAccessRights.SavedRequested))
Re Captcha
  • 3,125
  • 2
  • 22
  • 34
SBSB
  • 23
  • 8

1 Answers1

0

Your object is null (MD.objMemberAccessRights that is). MVC will not pass that back in the WHOLE model with out tweaking. especially lists

The simplest solution is to assume the lists are empty rebuild the lists after each request. By the looks of your code you are not persisting the data but i assume you will at the end?

What you need to do is persist the item after it has been moved and then requery the dB to recreate the lists.

You can avoid all this dB chattiness using jquery but that has its own challenges.

KevDevMan
  • 808
  • 11
  • 23