user474901
user474901

Reputation:

bind the drop down list in asp.net MVC4

I have controller for address I used it to enter multiple addresses but I want to create dropdosnlist to select the person and enter his addresses I create this helper class in my model folder to create select item

public class PersonsSelectItems
{
    public int SelectedId { get; set; }
    public List<Person> Persons { get; set; }
}

I use AddressController to send the selectitem to it view

public class AddressController : Controller
    {

        private readonly CustomersDBEntities context = new CustomersDBEntities();
        private PersonsSelectItems personsSelectItems= new PersonsSelectItems();

        ///get list of persones
        /// 
        public List<Person> GetPersonsList()
        {
            return (from c in personsSelectItems.Persons
                    select c).ToList();
        }

        //
        // GET: /Address/

        public ActionResult Index()
        {


            //var model = GetPersonsList(); //var model = GetPersonsList().Select(x => new SelectListItem
            //{
            //    Value = x.PersonID.ToString(),
            //    Text = x.FirstName,
            //    Selected = true | false
            //});

            ///var model = new PersonsSelectItems { Persons = GetPersonsList() };

            var model = GetPersonsList();
            return View(model);
        }

        // 
        // GET: /Address/Welcome/ 

        public string Welcome()
        {
            return "This is the Welcome action method...";
        }

        [HttpPost]
        public ActionResult Create(Address address)
        {
            //Loop through the request.forms

            var Addesslist = new List<Address>();
            for (int i = 1; i <= Request.Form.Count; i++)
            {
                var street = Request.Form["street_0" + i + ""];
                var city = Request.Form["city_0" + i + ""];
                var postalCode = Request.Form["postalCode_0" + i + ""];
                var province = Request.Form["province_0" + i + ""];
                var personID = 1;
                if (street != null && city != null && postalCode != null && province != null)
                {

                    try
                    {
                        context.Addresses.Add(new Address
                        {
                            Street = street,
                            City = city,
                            Province = province,
                            PostalCode = postalCode,
                            PersonID = personID
                        });
                        context.SaveChanges();
                    }
                    catch (Exception exc)
                    {

                    }
                }
                else
                {
                    break;
                }

            }
            return RedirectToAction("Index");
        }
    }

I get this expsetion

Value cannot be null. Parameter name: source

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.ArgumentNullException: Value cannot be null. Parameter name: source Adress view @model MVC.Models.Address

Tuple<Person,Order>
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

@using (Html.BeginForm("Create", "Address", FormMethod.Post))
{

@Html.DropDownListFor(x => x.Person, new SelectList(Model.Person, "PersonId", "FirstName"))



    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

        <div class="table-responsive">
            <table id="address_table" class="table">
                <thead>
                    <tr>
                        <th>Street</th>
                        <th>City</th>
                        <th>Province</th>
                        <th>PostalCode</th>
                        <th>&nbsp;</th>

                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>
                            <input id="Text1" type="text" name="street_01" maxlength="255" required class="street" /></td>
                        <td>
                            <input id="Text2" type="text" name="city_01" maxlength="255" required class="city" /></td>
                        <td>
                            <input id="Text3" type="text" name="province_01" maxlength="255" required class="province" /></td>
                        <td>
                            <input id="Text4" type="text" name="postalCode_01" maxlength="7" required class="postalCode" /></td>
                        <td>&nbsp;</td>
                    </tr>
                </tbody>
            </table>
        </div>
        <input type="button" value="Add Row" id="add_AdressRow" class="btn btn-lg btn-success btn-block" />

        <p>
            <input type="submit" value="Create" />
        </p>

}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

just want to ask how can I bind dropDwonList using list from GetPersonsList() function from AdressController and bind I now their are away to do it but I could not find it ?

Upvotes: 1

Views: 974

Answers (1)

Simon Whitehead
Simon Whitehead

Reputation: 65079

Your problem is that you're trying to use some LINQ over a null list.

This bad boy here:

public List<Person> Persons { get; set; }

Is null. You can add a constructor to your type to initialize it:

public class PersonsSelectItems
{
    public int SelectedId { get; set; }
    public List<Person> Persons { get; set; }

    public PersonsSelectItems() {
        Persons = new List<Person>();
    }
}

..and that will stop your current error.

I have to point out a couple of things though. Firstly, the naming Persons is strange. Make it an English plural of People.

Secondly, you don't actually have to use LINQ here. Your GetPersonList method can simply be:

public List<Person> GetPersonsList()
{
    return personsSelectItems.Persons;
}

Even then.. you have access to that collection already. So your model assignment can be:

var model = _personsSelectItems.Persons;

Upvotes: 3

Related Questions