Here is my situation:
I have a controller action called OrderFromCategory that fills the view model with data (the view model in this case is a list of elements like another view model). This is passed to a strongly typed view that displays a list of items and allows the user to change the amount of each item. On Post, my postcontroller action returns the model object back, but without the objects in the list. Did I miss something? Anyway, any help would be appreciated! Many thanks!
Also, is my check connected correctly? I canβt check it until I get the model data so that it is constant!
Here is the code:
ViewModel:
public class MenuItemsModel { public MenuItemsOrderModel() { items = new List<MenuItemOrderModel>(); } public List<MenuItemOrderModel> items { get; set; } } public class MenuItemOrderModel { public int ItemID { get; set; } [Display(Name = "Name")] public string ItemName { get; set; } [Display(Name = "Description")] public string Description { get; set; } [Display(Name = "Price")] [DataType(DataType.Currency)] public decimal Price { get; set; } [Display(Name = "Quantity")] public int Quantity { get; set; } public string Qualifier { get; set; } public int Minimum { get; set; } }
Controllers
public ActionResult OrderFromCategory(string id) { ViewData["category"] = id; Models.MenuItemsModel model = new Models.MenuItemsModel(); foreach (Models.MenuItem item in Models.MenuItemRepository.GetMenuItemsForCategory(id)) { model.items.Add(new Models.MenuItemOrderModel() { ItemID = item.ItemID, Description = item.Description, ItemName = item.Name, Price = item.Price, Qualifier = item.PriceQualifier, Minimum = item.MinimumQuantity, Quantity = ((namespace.Models.Order)Session["order"]).GetItemQuantity(item.ItemID) }); } return View(model); } [HttpPost] public ActionResult OrderFromCategory(string id, Models.MenuItemsModel model) { //check for user inputs in all items foreach (string inputKey in Request.Form.AllKeys) { Models.MenuItem item = Models.MenuItemService.GetMenuItem(int.Parse(inputKey)); int minimum = item.MinimumQuantity; int quantity = string.IsNullOrEmpty(Request.Form[inputKey]) ? 0 : int.Parse(Request.Form[inputKey]); if(quantity != 0 && quantity < minimum) { ModelState.AddModelError(string.Format("Quantity", item.ItemID), string.Format("Minimum of {0} required for order", minimum)); } if (!ModelState.IsValid) { return View(model); } Models.OrderService.UpdateItemInOrder((Models.Order)Session["order"], item.ItemID, quantity); } return RedirectToAction("PlaceOrder"); }
View:
@model namespace.Models.MenuItemsModel @{ ViewBag.Title = "Order from " + ViewData["category"]; } <h2>Order from @ViewData["category"] </h2> <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> @using (Html.BeginForm()) { @Html.ValidationSummary(true, "Order was unsuccessful. Please correct the errors and try again.") <div> <fieldset> @foreach (namespace.Models.MenuItemOrderModel item in Model.items) { <div class="item_group"> <div class = "item_name"> @item.ItemName </div> <div class = "item_description"> @item.Description </div> <div class = "item_price"> $@item.Price /@item.Qualifier (@item.Minimum miminum) </div> <div class = "item_quantity"> <div class="editor-label"> Quantity </div> <div class="editor-field"> @Html.TextBox(item.ItemID.ToString(), item.Quantity.ToString(), new { @class = "quantity_textbox", @type = "number"}) @Html.ValidationMessage("Quantity", "*") </div> </div> </div> } <p> <input type="submit" value="Continue" /> </p> </fieldset> </div> }
genus source share