Ответ 1
Ожидается параметр id
в вашем URL-адресе, но вы его не поставляете. Например:
http://yoursite.com/controller/edit/12
^^ missing
Я создаю Мое первое приложение MVC, у меня есть таблица в базе данных, содержащая 3 столбца:
Когда я нажимаю на ссылку редактирования, отредактируйте запись, ее следующее исключение:
Словарь параметров содержит нулевую запись для параметра '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");
}
Ожидается параметр id
в вашем URL-адресе, но вы его не поставляете. Например:
http://yoursite.com/controller/edit/12
^^ missing
в вашем
WebApiConfig
→ Register ()
Вы должны изменить на
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
Здесь routeTemplate
добавляется {action}
Эта ошибка означает, что среда MVC не может найти значение для вашего свойства id
, которое вы передаете в качестве аргумента методу Edit
.
MVC ищет эти значения в таких местах, как данные вашего маршрута, строка запроса и значения формы.
Например, следующее свойство передает свойство id
в строке запроса:
/Edit?id=1
Лучше всего отредактировать конфигурацию маршрутизации , чтобы вы могли передать это значение как часть самого URL:
/Edit/1
Этот процесс, в котором MVC выполняет поиск значений для ваших параметров, называется "Связывание моделей" и является одной из лучших функций MVC. Вы можете найти более подробную информацию о привязке модели здесь.
Является ли метод действия в вашей форме обозначающим /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)
Вы получаете эту ошибку, поскольку 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) {...}
), но если идентификатор был пустым, вы не знали, что редактировать.
У меня тоже была такая же проблема. Я исследовал и обнаружил отсутствующий атрибут {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 }
);
На всякий случай это помогает кому угодно; эта ошибка может возникать в Visual Studio, если у вас есть вкладка "Открыть как открытая", и эта вкладка зависит от параметра.
Закройте текущее представление и запустите приложение, и приложение запустится "Нормально"; если вы открываете представление, Visual Studio интерпретирует это, поскольку вы хотите запустить текущее представление.
Просто измените свою строку кода на
<a href="~/Required/[email protected]">Edit</a>
откуда вы вызываете эту функцию, которая будет передавать идентификатор corect id
У меня была такая же ошибка, но для меня проблема заключалась в том, что я делал запрос с неправильным GUID. Я пропустил последние 2 символа.
360476f3-a4c8-4e1c-96d7-3c451c6c86
360476f3-a4c8-4e1c-96d7-3c451c6c865e
я получил эту ошибку в create [post],
Словарь параметров содержит пустую запись для параметра "CustomerID" необнуляемого типа "System.Int32" для метода "System.Web.Mvc.ActionResult Create (Int32, TotalCha.Models.Job)" в "TotalCha.Controllers.JobController". ". Необязательный параметр должен быть ссылочным типом, обнуляемым типом или быть объявлен как необязательный параметр. Имя параметра: параметры
Просто добавьте атрибут маршрутизации, если он отсутствует в appconfig или webconfig
config.MapHttpAttributeRoutes()
Это может быть полезно для тех, кто все сделал правильно, но все еще сталкивается с проблемой. Для них "вышеуказанная ошибка также может быть вызвана неоднозначной ссылкой".
Если ваш Controller
содержит
using System.Web.Mvc;
а также
using System.Web.Http;
Это создаст неоднозначность и по умолчанию будет использовать настройки MVC RouteConfig
вместо настроек WebApiConfig
для routing
. Убедитесь, что для вызова WebAPI
вам нужна только ссылка на System.Web.Http
Я столкнулся с той же ошибкой.
Решение. Имя переменной в представлении, через которое мы передаем значение в контроллер, должно совпадать с именем переменной на стороне контроллера.
.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);
}