开发者

Why is my MVC viewModel null?

I'm trying to pass a viewModel to an edit form view. The issue is that I instanciate the model and assign values to it, but the model remains null.

My Action:

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

And my view looks like this:

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

The error I get is:

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 

I added a breakpoint on viewModel in my Action OrderEdit and all of the values were being passed as null to the view. I don't understand this because I hardcoded values for every parameter.

Why is my viewModel null?

edit

I do have javascript that adds dishes to the form. I took that out of the view listed above because it isn't relevent to the error.

edit: response to @Loki Stormbringer's answer

The FormInput paramter in public ActionResult OrderEdit(takeOrder FormInput) is intended to be bound to a formpost.

When I comment out:

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

Then the code performs as expected. But I don't understand why a null object is being assigned when I am specifically checking that the object is not null. The intended behavior is that if a form has been submitted then the viewModel is assigned the edited values, and if there is no form post submission then the viewModel uses the default values. Eventually, those default values will be coming from a db.

Why does if (FormInput != null) return true when FormInput is null?


Not sure if this has been noticed, but your Model is not actually null according to that error; ArgumentNullException. It would be NullReferenceException if Model was null

ArgumentNullException means that the Model.FoodItems collection is null when being passed to the Count() Extension method.


What is the value of the FormInput parameter? How are you calling this Action? My guess is that FormInput has something in it and is not null so the line

if (FormInput != null) viewModel = FormInput;

is executed which then blows away anything you put in viewModel above.


You have below in your Page header... is your viewmodel class definitely named "takeOrder"

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

Edit I just reread your post and it is your Model name... first thing would be to rename to TakeOrder

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜