MVC 4 - 尝试发布模型集合时的null模型

时间:2014-06-26 09:28:47

标签: asp.net-mvc-4 post nullreferenceexception

我看过SO并且有类似的问题,但我想回发一些模型,但是当我按下提交按钮时,它会抱怨我的模型为空。

我在我的应用程序中有这个视图

查看

@model List<Business.Models.Applications.ApplicantViewModel>
@using GridMvc.Html
@using (Html.BeginForm("AllocateFirst", "Application", FormMethod.Post))
{

    <div id="grid-wrap" style="width: 500px;">
        Allocate Application
        <div id="SystemMsg">
        </div>

        @Html.Grid(Model).Named("FirstStageGrid").Columns(columns =>
{
    columns.Add(m => m.Id);
    columns.Add(m => m.MembershipNumber).Titled("Membership number");
    columns.Add(m => m.DateReceived).Titled("Registered date");
    columns.Add(m => m.Fullname).Titled("Name").Filterable(true).Encoded(false);
    columns.Add(m => m.ApplicationType).Encoded(false).Sanitized(false);
    columns.Add(m => m.AssignedStaffMem).Encoded(false).Sanitized(false).RenderValueAs(m =>

        @<b>
            @Html.DropDownList("ddlStaff", new SelectList(Model.First().ListOfStaff, "UserId", "Fullname"))
        </b>
    );
    columns
.Add()
.Encoded(false)
.Titled("Action")
.Sanitized(false)
.SetWidth(30)
.RenderValueAs(m =>

  @<b> <a href="#" onclick="AssignStaff(@m.Id, @Html.Raw("\"") @m.Fullname.Trim() @Html.Raw("\""), @m.Id)">
      Assign</a> </b>
);
}).WithPaging(5)

  <br />
        Assign on bulk: @Html.CheckBox("AssignOnBulk")
        <br />
        <div id="bulkAssign">

            Assign to: @Html.DropDownList("ddlStaff", new SelectList(Model.First().ListOfStaff, "UserId", "Fullname"))
            @Html.Hidden("hdnStaffId")
            <input type="submit" value="Submit all on bulk" />
        </div>


    </div>
    <script>

        $('#AssignOnBulk').on('change', function () {
            if ($(this).is(':checked')) {
                $("#bulkAssign").show();
                var staffId = $('#ddlStaff').val(); //no :selected here

            }
            else {
                $("#bulkAssign").hide();
                $("hdnStaffId").val(this);
                var staffId = $('#ddlStaff').val(); //no :selected here
            }
        });

        $('#ddlStaff').change(function () {
            var staffId = $('#ddlStaff').val(); //no :selected here
        });

        $(document).ready(function () {
            if ($(AssignOnBulk).is(':checked'))
                $("#bulkAssign").show();
            else
                $("#bulkAssign").hide();
        });


        function AssignStaff(appId, fullName) {
            //Get row based on Id of grid
            var tableRow = $("td").filter(function () {
                return $(this).text() == appId;
            }).closest("tr");

            // get staffId based on option selected in tr
            var staffId = $(tableRow).find('option:selected').val();

            $.ajax({
                type: "GET",
                url: '/Application/SetFirstCheck',
                dataType: 'html',
                data: { "staffId": staffId, "appId": appId },
                success: function (success) {
                    $('#SystemMsg').html(success);
                    $(tableRow).remove();
                }
            });
        }
    </script>

}

我想要做的是如果用户选中此复选框

Assign on bulk: @Html.CheckBox("AssignOnBulk")

带按钮的div显示一个下拉菜单,用户可以决定将一个人分配给网格中的所有人,而不是使用动作链接。

我想要做的是按下发布按钮,它会从下拉菜单中回发集合和staffId。但是当我按帖子时,VS2012突出显示我的网格,并说该模型为空。

控制器方法

 [HttpPost]
        public ActionResult AllocateFirst(List<Business.Models.Applications.ApplicantViewModel> Model, bool AssignOnBulk, string ddlStaff)
        {

            return View(Model);
        }

enter image description here

我附上了点击帖子时发生的情况的截图,它突出显示了我的整个网格。

1 个答案:

答案 0 :(得分:0)

嗯,无法从视图中将List或对象发送到控制器。即使您想要仅发布对象,您也必须填写页面上的每个属性...

您可以向控制器发送信息,感谢您可以在那里加载列表,或者您需要使用Ajax和JSON.Stringify。

类似的东西:

<script> var myList = []; myList.push({ Id: 1, Name: 'Test', Surname: 'Test2' }); jQuery.ajax({ url: '../Controller/Action, data: '{ modelList:' + JSON.stringify(myList) + '}', type: 'POST', cache: false, dataType: 'JSON', contentType: 'application/json; charset=utf-8', success: function (data) { }, error: function (data) { } }); </script>