0

my development environment is ASP.NET MVC 5 using Entity Framework 6 using a code-first workflow.

My problem: When trying to add a new record to the database, the values from my two dropdownlists are not being included. All the other fields are indeed saving to the database.

I am passing a ViewModel to the view in question:

public class NewItemViewModel
{
    public IEnumerable<Category> Categories { get; set; }
    public Item Item { get; set; }
    public IEnumerable<Donor> Donors { get; set; }
}

The domain models I am using:

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int Quantity { get; set; }
    public bool IsActive { get; set; }
    public Category Category { get; set; }
    public Donor Donor { get; set; }
}

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Donor
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get { return FirstName + " " + LastName; } }
    public string Email { get; set; }
}

The relevant controller: This New() action is simply used to pass data to the view for the form to be submitted

public ActionResult New()
    {
        var itemCategories = _context.ItemCategory.ToList();
        var donors = _context.Donors.ToList();

        var viewModel = new NewItemViewModel
        {
            Categories = itemCategories,
            Donors = donors
        };

        return View(viewModel);
    }

Here is my actual action that adds the submitted data to the database:

// Create a new item.
    [HttpPost]
    public ActionResult Create(Item item)
    {
        _context.Items.Add(item);
        _context.SaveChanges();

        return RedirectToAction("Index", "Item");
    }

And lastly, the view itself (I will minimize the code here):

@using (Html.BeginForm("Create", "Item"))
{
<div class="form-group">
    @Html.LabelFor(m => m.Item.Donor)
    @Html.DropDownListFor(m => m.Item.Donor, new SelectList(Model.Donors, "Id", "FullName"), "Who donated this item?", new { @class = "form-control" })
</div>

<div class="form-group">
    @Html.LabelFor(m => m.Item.Category)
    @Html.DropDownListFor(m => m.Item.Category, new SelectList(Model.Categories, "Id", "Name"), "Select Item Category", new { @class = "form-control" })
</div>
}

To reiterate the problem I am having: The values of the dropdownlist for Category and Donor are not saving to the database, whereas the others (non-navigation properties?) Name, Description, Quantity, etc. is working correctly.

Am I using the ViewModel the right way? I was under the impression that the MVC framework knows how to deal with passing the Item object parameter in the Create() action - mapping what it needs to within the Item entity.

Any help would be much appreciated. Thank you.

user3605194
  • 51
  • 1
  • 5

1 Answers1

0

In the NewItemViewModel you have not created property to hold the selected values from dropdown

public class NewItemViewModel
{
    public IEnumerable<Category> Categories { get; set; }
    public int SelectedCategory{get;set;}
    public Item Item { get; set; }
    public int SelectedDonor{get;set;}
    public IEnumerable<Donor> Donors { get; set; }
}


@using (Html.BeginForm("Create", "Item"))
{
<div class="form-group">
    @Html.LabelFor(m => m.Item.Donor)
    @Html.DropDownListFor(m => m.SelectedDonor, new SelectList(Model.Donors, "Id", "FullName"), "Who donated this item?", new { @class = "form-control" })
</div>

<div class="form-group">
    @Html.LabelFor(m => m.Item.Category)
    @Html.DropDownListFor(m => m.SelectedCategory, new SelectList(Model.Categories, "Id", "Name"), "Select Item Category", new { @class = "form-control" })
</div>
}
Nitin Sawant
  • 7,278
  • 9
  • 52
  • 98