Когда я пытаюсь добавить новую категорию, я получил: «Словарь параметров содержит пустую запись для параметра« X »не допускающего значения NULL типа« System.Int32 »» - PullRequest
0 голосов
/ 29 мая 2020

Ошибка:

Словарь параметров содержит пустую запись для параметра 'categoryId' не допускающего значения NULL типа 'System.Int32' для метода 'System.Web. Mvc .ActionResult UpdateCategory ( Int32) 'в' OnlineStore.Controllers.AdminController '. Необязательный параметр должен быть ссылочным типом, типом, допускающим значение NULL, или быть объявленным как необязательный параметр. Название параметра: параметры.

Это код:

@model OnlineStore.Models.CategoryDetail
@{
    ViewBag.Title = "UpdateCategory";
    Layout = "~/Views/Shared/_AdminLayout.cshtml";
}




<div class="container-fluid">
    <!-- Breadcrumbs-->

    <ol class="breadcrumb">
        <li class="breadcrumb-item">
            <a href="#">Dashboard</a>
        </li>
        <li class="breadcrumb-item ">Categories</li>
        <li class="breadcrumb-item active">Add New Category</li>


    </ol>
    <!-- DataTables Example -->
    <div class="card mb-3">
        <div class="card-header">
            <i class="fas fa-table"></i>
            Add New Category

        </div>
        <div class="card-body">
            @using (Html.BeginForm("UpdateCategory", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" }))
            {
                @Html.HiddenFor(m => m.CategoryId)

                <div class="form-group">
                    <label class="control-label">Category Name</label>

                    @Html.TextBoxFor(m => m.CategoryName, new { @class = "form-control", placeholder = "Enter category Name", required = "required", autofocus = "autofocus" })
                    @Html.ValidationMessageFor(m => m.CategoryName, "", new { @class = "text-danger" })
                </div>

                <a onclick="window.history.back();" class="btn btn-danger">Cancel</a>
                <input type="submit" class="btn btn-primary" value="Save" />
            }
        </div>
    </div>
</div>

public ActionResult UpdateCategory(int categoryId)
        {
            CategoryDetail cd;
            if (categoryId != null)
            {
                cd = JsonConvert.DeserializeObject<CategoryDetail>(JsonConvert.SerializeObject(_unitOfWork.GetRepositoryInstance<Tbl_Category>().GetFirstorDefault(categoryId)));
            }
            else
            {
                cd = new CategoryDetail();
            }
            return View("UpdateCategory", cd);

        }

1 Ответ

0 голосов
/ 29 мая 2020

Html .HiddenFor предполагает, что параметр действия отправки является объектом модели представления, поэтому имя, которое он генерирует для скрытого ввода, создается таким образом, чтобы связыватель модели MVC распознал его как свойство CategoryDetail. Однако у вас этого нет - вместо этого вы передаете голое целое число обратно в метод действия. Это нормально, но эти два подхода не совпадают.

Вы можете исправить это одним из двух способов:

  • изменить метод действия, чтобы он принял параметр CategoryDetail. Это будет новый экземпляр класса, содержащий только значения, заполненные телом сообщения формы.
  • используйте вместо него Html .Hidden, который не пытается угадать имя сгенерированного элемента управления вводом и передает объект параметра new { @name = "categoryId" } - согласно этот ответ HiddenFor предназначен для помощи и не допускает такого уровня гибкости
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...