Форма не возвращает значение в действие контроллера из-за конфликта ID - PullRequest
1 голос
/ 03 июня 2019

У меня есть форма с DropDownListFor.Когда я выбираю идентификатор в раскрывающемся списке, выбираю дату и нажимаю кнопку «Отправить», я получаю сообщение об ошибке:

Словарь параметров содержит пустую запись для параметра «CasinoID» необнуляемого типа «Система»..Int32 для метода «System.Web.Mvc.ActionResult Index (Int32, System.DateTime, NameSpace.ViewModels.TerminalReceiptPostData)» в «Namesppace.Controllers.TerminalReceiptsController».Необязательный параметр должен быть ссылочным типом, обнуляемым типом или быть объявлен как необязательный параметр.Имя параметра: параметры

Это работало нормально только с обычным тегом Input и вводом его вручную ... однако, когда я добавил DropDownList, возникает эта проблема.Я неправильно настраиваю DDL?Любые другие вопросы относительно того, почему это произошло?Ниже приведен код.

Действие контроллера:

    [HttpPost]
    public ActionResult Index(int CasinoID, DateTime Date)
    {
         var model = TRBL.GetTransactionTestsData(CasinoID, Date);

        return View(model);
    }

Просмотр:

@using (Html.BeginForm("Index", "TerminalReceipts", new { id = "submitForm" }))
 {

    <div>
        @*<input type="text" name="CasinoID" placeholder="Enter Casino ID" id="cIdSearch" />*@
        @Html.DropDownListFor(o => o.TerminalReceiptPostData.CasinoIdDDL, Model.TerminalReceiptPostData.CasinoIdDDL, new { id = "CasinoID"})
        <input id="datepicker" class="datepicker-base" name="Date" placeholder="MM/DD/YYY" type="text" />
        <button type="submit" class="btn btn-sm  btn-primary" id="search" onclick="checkField()"> Search Transactions</button>
    </div>

 }

Редактировать обновление

Итак, я смог немного изменить структуру, чтобы теперь можно было правильно передавать CasinoID в действие контроллера.Ниже приведены изменения ... однако после того, как действие возвращает модель, я получаю ссылку на объект obj, не установленную на экземпляр объекта ошибки.

Действие:

      [HttpPost]
    public ActionResult Index(int CasinoID, DateTime Date)
    {

        var id = Int32.Parse(Request.Form["CasinoID"].ToString());

        var model = TRBL.GetTransactionTestsData(id, Date);

        return View(model);
    }

Изменить наDDL:

                @Html.DropDownList("CasinoID", Model.TerminalReceiptPostData.CasinoIdDDL, "Select Casino")

Ответы [ 2 ]

1 голос
/ 03 июня 2019

int CasinoID будет связан полем формы с именем CasinoID. Я думаю, что @ Html.DropDownListFor не генерирует нужное вам имя.

Вы можете добавить имя явно как

@Html.DropDownListFor(o => o.TerminalReceiptPostData.CasinoIdDDL, Model.TerminalReceiptPostData.CasinoIdDDL, new { id = "CasinoID", name="CasinoID"})

Или лучше создать ViewModel с полями CasinoID, Date & CId и использовать BindProperty в этом экземпляре ViewModel

0 голосов
/ 03 июня 2019

Хорошо, поэтому я разобрался, что происходит ..

На самом деле у меня есть два отдельных действия контроллера с именем Index. Один для поста и один для получения. Поскольку сейчас я отправляю модель на POST, выпадающий список не «переполняется» выпадающими списками ... Поэтому я просто принял вызов из действия GET и добавил его в сообщение.

        [HttpPost]
    public ActionResult Index(int CasinoID, DateTime Date)
    {

            var id = Int32.Parse(Request.Form["CasinoID"].ToString());

            var model = TRBL.GetTransactionTestsData(id, Date);

            model.TerminalReceiptPostData = TRBL.GetCasinosDDL();

            return View(model);

    }

Вероятно, не лучший способ сделать это, но отлично работает.

...