Why is this web http exception happening when I am

2019-09-20 08:58发布

问题:

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" />
    }

回答1:

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" />
}