Sulaiman Sulaiman - 3 years ago 131
ASP.NET (C#) Question

Why is this web http exception happening when I am populating a drop down list?

Model

League
and
LeagueDivision
are two model classes

public class League
{
public int Id { get; set; }
public string League1 { get; set; }
public string Icon { get; set; }

public virtual ICollection<LeagueDivision> LeagueDivisions { get; set; }
}

public class LeagueDivision
{
public int Id { get; set; }
public Nullable<int> LeagueId { get; set; }
public string Name { get; set; }
public string Icon { get; set; }

public virtual League League { get; set; }
}

public class ViewModelForHostBooster
{
[Required(ErrorMessage = "Please enter price")]
[Display(Name = "Price")]
public decimal Price { get; set; }

[Required(ErrorMessage = "Please select a league")]
[Display(Name = "League")]

public int? SelectedLeague { get; set; }
[Required(ErrorMessage = "Please select a league division")]
[Display(Name = "League Division")]

public int? SelectedLeagueDivision { get; set; }

public SelectList LeagueList { get; set; }
public SelectList LeagueDivisionList { get; set; }


}


Controller

In
IndexDropdown
action I am just populating view with model and validating if
the model is validated then populate the view otherwise return the view. In
FetchLeagueDivision
action I am selecting Id and Name properties of model class based on passed argument ID.

Can anybody guide me why a
WebHttpException
is happening when I run this piece of code? Here is a link of exception Http Exception Image

public class DropDownController : Controller
{
[HttpGet]
public ActionResult IndexDropDown()
{
ViewModelForHostBooster model = new ViewModelForHostBooster();

ConfigureViewModel(model);
return View(model);
}

[HttpPost]
public ActionResult IndexDropDown(ViewModelForHostBooster model)
{
if (!ModelState.IsValid)
{
ConfigureViewModel(model);
return View(model);
}

// save and redirect
return RedirectToAction("Somewhere");
}


private void ConfigureViewModel(ViewModelForHostBooster model)
{
HostBoostersDBEntities db = new HostBoostersDBEntities();

var leagues = db.Leagues.Select(x => new { Value = x.Id, Text = x.League1 }).ToList();
model.LeagueList = new SelectList(leagues, "Id", "League1");

if (model.SelectedLeague.HasValue)
{
IEnumerable<LeagueDivision> leaguedivisions = db.LeagueDivisions.Where(l => l.LeagueId == model.SelectedLeague.Value);
model.LeagueDivisionList = new SelectList(leaguedivisions, "Id", "Name");
}
else
{
model.LeagueDivisionList = new SelectList(Enumerable.Empty<SelectListItem>());
}
}
}


View

@model HostBooster.Models.ViewModelForHostBooster
@using (Html.BeginForm())
{
<div>
@Html.LabelFor(m => m.Price)
@Html.TextBoxFor(m => m.Price)
@Html.ValidationMessageFor(m => m.Price)
</div>

<div>
@Html.LabelFor(m => m.SelectedLeague)



exception is occurring here @Html.DropDownListFor(m => m.SelectedLeague, Model.LeagueList)


@Html.DropDownListFor(m => m.SelectedLeague, Model.LeagueList)
@Html.ValidationMessageFor(m => m.SelectedLeague)
</div>
<div>
@Html.LabelFor(m => m.SelectedLeagueDivision)
@Html.DropDownListFor(m => m.SelectedLeagueDivision, Model.LeagueDivisionList)
@Html.ValidationMessageFor(m => m.SelectedLeagueDivision)
</div>
<input type="submit" value="save" />
}

Answer Source

In view Model.LeagueList is null. It should not be null. if edit view code like this(for example), Works well:

<body>
@using (Html.BeginForm())
{
    List<SelectListItem> listItems = new List<SelectListItem>();
    listItems.Add(new SelectListItem
    {
        Text = "Example1",
        Value = "Example1"
    });
    listItems.Add(new SelectListItem
    {
        Text = "Example2",
        Value = "Example2",
        Selected = true
    });
    listItems.Add(new SelectListItem
    {
        Text = "Example3",
        Value = "Example3"
    });


    <div>
        @Html.LabelFor(m => m.Price)
        @Html.TextBoxFor(m => m.Price)
        @Html.ValidationMessageFor(m => m.Price)
    </div>

    <div>
        @Html.LabelFor(m => m.SelectedLeague)
        @Html.DropDownListFor(m => m.SelectedLeague, listItems)
        @Html.ValidationMessageFor(m => m.SelectedLeague)
    </div>
    <div>
        @Html.LabelFor(m => m.SelectedLeagueDivision)
        @Html.DropDownListFor(m => m.SelectedLeagueDivision, Model.LeagueDivisionList)
        @Html.ValidationMessageFor(m => m.SelectedLeagueDivision)
    </div>
    <input type="submit" value="save" />
}

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download