MVC 4 — нулевая модель при попытке опубликовать коллекцию моделей

#asp.net-mvc-4 #post #nullreferenceexception

#asp.net-mvc-4 #Публикация #исключение 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 с кнопкой отображается в выпадающем меню, и пользователь может назначить одного человека всем людям в сетке вместо использования actionlink.

Что я хочу сделать, это нажать кнопку post, и она вернет коллекцию плюс идентификатор StaffID из выпадающего меню. Но когда я нажимаю post, VS2012 выделяет мою сетку и сообщает, что модель равна нулю.

Метод контроллера

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

            return View(Model);
        }
 

введите описание изображения здесь

Я приложил скриншот того, что происходит, когда я нажимаю на сообщение, оно выделяет всю мою сетку.

Комментарии:

1. Можете ли вы опубликовать код модели представления вашего приложения

2. Попробуйте @model IEnumerable<Бизнес. Модели. Приложения. ApplicantViewModel>

Ответ №1:

Ну, невозможно отправить список или объект контроллеру из представления. Даже если вы хотите опубликовать только объект, вы должны заполнить каждое свойство на странице…

Вы можете отправить информацию контроллеру, благодаря которой вы сможете загрузить туда список, или вам нужно использовать 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>