Редактировать детали, используя GUID для гиперссылки (ошибка System.Int32 с ненулевым типом)

#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
}
  

Готово! Теперь все работает так, как ожидалось.