Модель ASP.NET MVC3 View не является нулевой, но в ней отсутствуют данные при отправке обратно в контроллер - PullRequest
4 голосов
/ 01 марта 2012

Вот моя ситуация:

У меня есть действие контроллера с именем OrderFromCategory, которое заполняет модель представления данными (в этом случае модель представления - это просто список элементов типа другой модели представления).Это передается в строго типизированное представление, которое отображает список элементов и позволяет пользователю изменять количество каждого элемента.В Post действие моего контроллера post получает объект модели обратно, но в списке нет объектов.Я что-то пропустил?В убыток, любая помощь будет оценена!Большое спасибо заранее!

Кроме того, правильно ли проведена проверка?Не могу проверить это, пока я не получу постоянные данные модели!

Вот код:

Модель представления:

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; }
}

Контроллеры:

    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");
    }

Просмотр:

@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>
}

1 Ответ

6 голосов
/ 01 марта 2012

Похоже, в вашей форме нет соответствующих полей ввода для полей модели представления Также неправильное название вашего количества текстовое поле. Попробуйте заменить цикл foreach в представлении следующим:

@for (int i = 0; i < Model.items.Count; i++)
{
    @Html.HiddenFor(x => x.items[i].ItemID)
    @Html.HiddenFor(x => x.items[i].ItemName)
    @Html.HiddenFor(x => x.items[i].Description)
    @Html.HiddenFor(x => x.items[i].Price)
    @Html.HiddenFor(x => x.items[i].Qualifier)
    @Html.HiddenFor(x => x.items[i].Minimum)

    <div class="item_group">
        <div class = "item_name">
            @Model.items[i].ItemName
        </div>
        <div class = "item_description">
            @Model.items[i].Description
        </div>
        <div class = "item_price">
            $@Model.items[i].Price /@Model.items[i].Qualifier  (@Model.items[i].Minimum miminum)
        </div> 
        <div class = "item_quantity">
        <div class="editor-label">
            Quantity
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(x => x.items[i].Quantity, new { @class = "quantity_textbox", @type = "number" })
            @Html.ValidationMessageFor(x => x.items[i].Quantity, "*")
        </div>
        </div>
    </div>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...