#c# #asp.net-mvc
#c# #asp.net-mvc
Вопрос:
Я получаю «ошибку System.Int32 с ненулевым типом», когда нажимаю на гиперссылку ниже.
@Html.ActionLink("Edit", "Edit", "Student", new { id = item.Id },null)
Структура класса
public class BasicInfo
{
public Guid Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
.......
}
Метод просмотра контроллера
public ActionResult Edit(int id)
{
if (id != null)
{
//dbConnect's edit method return the records base on selected records
//edit method calling store procedure to fetch records and return list
return View("Edit", dbConnect.edit(ObjInfo));
}
return View();
}
если вы видите скриншот ниже, то вы заметили, что GUID передается в URL, но «00000000-0000-0000-0000-000000000000» не существует в базе данных.
Насколько я понимаю, URL-адрес должен содержать GUID, который хранит базу данных в соответствующей записи.
дайте мне знать, если потребуется дополнительная информация
Комментарии:
1. Сообщение об ошибке кажется довольно понятным: вы указали нулевое значение для
id
. Вы должны выяснить, почему.2. я не могу определить, как его значение null передается в ID? выбранные записи содержат значение GUID (id) в базе данных
3. Сервер должен интерпретировать
00000000-0000-0000-0000-000000000000
какnull
GUID. Попробуйте другой GUID; вы все равно никогда не увидите GUID с нулями в своей базе данных, если только вы специально не напишете его там.4. Да, Роберт, я пробовал использовать существующее значение GUID, но оно выдало мне то же самое сообщение об ошибке.
5. @Beginners — вы используете …
Edit(int id)
— так не должно быть…Edit(Guid id)
Ответ №1:
Похоже, вам нужно добавить пользовательскую модель binder согласно here:
Когда вам нужно иметь параметр типа Guid в ваших действиях, необходимо создание пользовательской модели binder. Это мой пользовательский ModelBinder:
public class GuidModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var parameter = bindingContext
.ValueProvider
.GetValue(bindingContext.ModelName);
return Guid.Parse(parameter.AttemptedValue);
}
}
Теперь нам нужно зарегистрировать наш пользовательский ModelBinder при запуске вашего приложения. Мы можем сделать это так (в
Application_Start
методеGlobal.asax.cs
):
ModelBinders.Binders.Add(typeof(Guid), new GuidModelBinder());
Таким образом, наше действие выглядит следующим образом:
public ActionResult Edit(Guid id)
{
// Your code here
}
Готово! Теперь все работает так, как ожидалось.