Почему моя MVC viewModel пуста? - PullRequest
1 голос
/ 01 октября 2010

Я пытаюсь передать viewModel в представление формы редактирования.Проблема в том, что я создаю экземпляр модели и присваиваю ей значения, но модель остается нулевой.

Мое действие:

    public ActionResult OrderEdit(takeOrder FormInput)
    {
        takeOrder viewModel = new takeOrder
        {
            Name= "anonymous",
            TableNumber = 13,
            FoodItems = new List<FoodItem> {
                new FoodItem{ DishName = "Dishname value 1", Price = 10 },
                new FoodItem{ DishName = "Dishname value 2", Price = 20 },
                new FoodItem{ DishName = "Dishname value 3", Price = 30 },
                new FoodItem{ DishName = "Dishname value 4", Price = 40 },
            }
        };
        if (FormInput != null)
            viewModel = FormInput;

        return View(viewModel);
    }

И мой взгляд выглядит следующим образом:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/genesis.Master" Inherits="System.Web.Mvc.ViewPage<Genesis_0_02.Models.takeOrder>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    OrderEdit
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
            <h2>OrderEdit</h2>
    <% using (Html.BeginForm())
       { %>
        <%: Html.ValidationSummary() %>
        <p>
            <%: Html.LabelFor(x => x.Name) %><br />
            <%: Html.TextBoxFor(x => x.Name) %>
        </p>
        <p>
            <%: Html.LabelFor(x => x.TableNumber) %><br />
            <%: Html.TextBoxFor(x => x.TableNumber) %>
        </p>
        <button type="button" id="AddListItem">Add a dish to your order</button>
        <br />
        <% for (int i = 0; i < Model.FoodItems.Count(); i++ )%>
        <% { %>
        <div class="ListItem">
        <button type="button" class="RemoveListItem">X</button>
            Dish: <%: Html.TextBoxFor(x => x.FoodItems[i].DishName, new { style = "width:60px;" } )%>
            Price: <%: Html.TextBoxFor(x => x.FoodItems[i].Price, new { style = "width:60px;" })%>
        </div>
        <% } %>
        <br />
<button type="submit">Submit Order</button>

    <% } %>

</asp:Content>

Я получаю ошибку:

Exception Details: System.ArgumentNullException: Value cannot be null.
Parameter name: source

Source Error: 


Line 64:         <button type="button" id="AddListItem">Add a dish to your order</button>
Line 65:         <br />
--> error --> Line 66:         <% for (int i = 0; i < Model.FoodItems.Count(); i++ )%>
Line 67:         <% { %>
Line 68:         <div class="ListItem">


Source File: pathtotheproject\Genesis.0.02\Genesis.0.02\Views\Admin\OrderEdit.aspx    Line: 66 

Я добавил точку останова на viewModel в своем действии OrderEdit, и все значения были переданы как нулевые в представление.Я не понимаю этого, потому что я жестко запрограммировал значения для каждого параметра.

Почему мой viewModel нулевой?

edit

У меня есть javascript, который добавляет блюда кформа.Я исключил это из представленного выше представления, потому что оно не приводит к ошибке.

edit: ответ на ответ @Loki Stormbringer

Параметр FormInput в public ActionResult OrderEdit(takeOrder FormInput) предназначенбыть связанным с формпостом.

Когда я закомментирую:

        // if (FormInput != null)
        //    viewModel = FormInput;

Тогда код работает как положено.Но я не понимаю, почему объект null назначается, когда я специально проверяю, что объект не является нулевым.Предполагается, что если форма была отправлена, то viewModel присваивается отредактированные значения, а если после отправки формы нет, viewModel использует значения по умолчанию.В конечном итоге эти значения по умолчанию будут поступать из БД.

Почему if (FormInput != null) возвращает true, если FormInput равно нулю?

Ответы [ 3 ]

3 голосов
/ 01 октября 2010

Не уверен, если это было замечено, но ваша Модель не фактически равна нулю в соответствии с этой ошибкой; ArgumentNullException. Было бы NullReferenceException, если Модель была бы нулевой

ArgumentNullException означает, что коллекция Model.FoodItems равна нулю при передаче в метод расширения Count().

1 голос
/ 01 октября 2010

Каково значение параметра FormInput?Как вы называете это действие?Я предполагаю, что в FormInput что-то есть и оно не равно нулю, поэтому строка

if (FormInput! = Null) viewModel = FormInput;

выполняется, что затем сдувает все, что вы положили в viewModel выше.

0 голосов
/ 01 октября 2010

У вас в заголовке страницы ниже ... ваш класс viewmodel определенно назван "takeOrder"

Inherits="System.Web.Mvc.ViewPage<Genesis_0_02.Models.takeOrder>

Edit Я просто перечитал ваш пост, и это название вашей модели.. первым делом было бы переименовать в TakeOrder

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...