Словарь параметров содержит нулевую запись для параметра 'id' типа, не имеющего значения nullable 'System.Int32'

Я создаю Мое первое приложение MVC, у меня есть таблица в базе данных, содержащая 3 столбца:

  • Id → первичный ключ
  • Имя пользователя
  • пароль

Когда я нажимаю на ссылку редактирования, отредактируйте запись, ее следующее исключение:

Словарь параметров содержит нулевую запись для параметра 'id' типа, отличного от nullable 'System.Int32' для метода 'System.Web.Mvc.ActionResult Edit (Int32)' в 'MvcApplication1.Controllers.UserController'. Необязательный параметр должен быть ссылочным типом, нулевым типом или объявлен как необязательный параметр. Имя параметра: параметры

Вот мой код редактирования:

public ActionResult Edit(int id, User collection)
{
    UserDBMLDataContext db = new UserDBMLDataContext();
    var q = from abc in db.User_Login_Details
            where abc.Id == id
            select abc;

    IList lst = q.ToList();

    User_Login_Details userLook = (User_Login_Details)lst[0];

    userLook.Username = collection.UserName;
    userLook.Password = collection.Password;
    db.SubmitChanges();
    return RedirectToAction("Index");                  
}

Ответы

Ответ 1

Ожидается параметр id в вашем URL-адресе, но вы его не поставляете. Например:

http://yoursite.com/controller/edit/12
                                    ^^ missing

Ответ 2

в вашем WebApiConfigRegister () Вы должны изменить на

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }

Здесь routeTemplate добавляется {action}

Ответ 3

Эта ошибка означает, что среда MVC не может найти значение для вашего свойства id, которое вы передаете в качестве аргумента методу Edit.

MVC ищет эти значения в таких местах, как данные вашего маршрута, строка запроса и значения формы.

Например, следующее свойство передает свойство id в строке запроса:

/Edit?id=1

Лучше всего отредактировать конфигурацию маршрутизации , чтобы вы могли передать это значение как часть самого URL:

/Edit/1

Этот процесс, в котором MVC выполняет поиск значений для ваших параметров, называется "Связывание моделей" и является одной из лучших функций MVC. Вы можете найти более подробную информацию о привязке модели здесь.

Ответ 4

Является ли метод действия в вашей форме обозначающим /controller/edit/1?

Попробуйте использовать один из следующих вариантов:

// the null in the last position is the html attributes, which you usually won't use
// on a form.  These invocations are kinda ugly
Html.BeginForm("Edit", "User", new { Id = Model.Id }, FormMethod.Post, null)

Html.BeginForm(new { action="Edit", controller="User", id = Model.Id })

Или внутри вашей формы добавьте скрытое поле "Id"

@Html.HiddenFor(m => m.Id)

Ответ 5

Вы получаете эту ошибку, поскольку ASP.NET MVC не может найти значение параметра id, чтобы указать параметр id вашего метода действий.

Вам необходимо передать это как часть URL-адреса ( "/Home/Edit/123" ) в качестве параметра строки запроса ( "/Home/Edit? id = 123" ) или в качестве параметра POSTed (make обязательно введите что-то вроде <input type="hidden" name="id" value="123" /> в вашей HTML-форме).

В качестве альтернативы вы можете сделать параметр id равным nullable int (Edit(int? id, User collection) {...}), но если идентификатор был пустым, вы не знали, что редактировать.

Ответ 6

У меня тоже была такая же проблема. Я исследовал и обнаружил отсутствующий атрибут {action} из шаблона маршрута.

Перед кодом (Имея проблемы):

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

После исправления (рабочий код):

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

Ответ 7

На всякий случай это помогает кому угодно; эта ошибка может возникать в Visual Studio, если у вас есть вкладка "Открыть как открытая", и эта вкладка зависит от параметра.

Закройте текущее представление и запустите приложение, и приложение запустится "Нормально"; если вы открываете представление, Visual Studio интерпретирует это, поскольку вы хотите запустить текущее представление.

Ответ 8

Просто измените свою строку кода на

<a href="~/Required/[email protected]">Edit</a>

откуда вы вызываете эту функцию, которая будет передавать идентификатор corect id

Ответ 9

У меня была такая же ошибка, но для меня проблема заключалась в том, что я делал запрос с неправильным GUID. Я пропустил последние 2 символа.

360476f3-a4c8-4e1c-96d7-3c451c6c86
360476f3-a4c8-4e1c-96d7-3c451c6c865e

Ответ 10

я получил эту ошибку в create [post],

Словарь параметров содержит пустую запись для параметра "CustomerID" необнуляемого типа "System.Int32" для метода "System.Web.Mvc.ActionResult Create (Int32, TotalCha.Models.Job)" в "TotalCha.Controllers.JobController". ". Необязательный параметр должен быть ссылочным типом, обнуляемым типом или быть объявлен как необязательный параметр. Имя параметра: параметры

Ответ 11

Просто добавьте атрибут маршрутизации, если он отсутствует в appconfig или webconfig

config.MapHttpAttributeRoutes()

Ответ 12

Это может быть полезно для тех, кто все сделал правильно, но все еще сталкивается с проблемой. Для них "вышеуказанная ошибка также может быть вызвана неоднозначной ссылкой".

Если ваш Controller содержит

using System.Web.Mvc;

а также

using System.Web.Http;

Это создаст неоднозначность и по умолчанию будет использовать настройки MVC RouteConfig вместо настроек WebApiConfig для routing. Убедитесь, что для вызова WebAPI вам нужна только ссылка на System.Web.Http

Ответ 13

Я столкнулся с той же ошибкой.

Решение. Имя переменной в представлении, через которое мы передаем значение в контроллер, должно совпадать с именем переменной на стороне контроллера.

.csHtml (Просмотр):

@Html.ActionLink("Edit", "Edit" , new { id=item.EmployeeId })

.cs (метод контроллера):

 [HttpGet]
            public ActionResult Edit(int id)
            {
                EmployeeContext employeeContext = new EmployeeContext();
                Employee employee = employeeContext.Employees.Where(emp => emp.EmployeeId == id).First();
                return View(employee);
            }