ViewResult не возвращает значения после использования нового параметра (не идентификатора)

У меня странная проблема с отображением записи. Если пользователь вводит числовое (int) значение штрих-кода в URL-адрес, я должен показать детали записи, связанной с этим штрих-кодом. Когда-то для штрих-кодов использовались идентификаторы GUID (CodeId GUID PK), но теперь мы добавляем новое поле Int (SerialId IDENTITY Int), чтобы отслеживать фактическое значение штрих-кода; нам не разрешено изменять поле CodeId в таблице (которое называется Code), поэтому это приводит к моей странной проблеме. Я осмотрелся и обнаружил, что этот параметр QueryString id не используется самое близкое, что я могу найти, чтобы обратиться к тому, что происходит со мной.

Моя маршрутизация совершенно нормальная

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

Модель нормальная

public DbSet<Code> Codes { get; set; }

public partial class Code
{
    public System.Guid CodeId { get; set; }
    public int SerialId { get; set; }
    public string Title { get; set; }
    public string BarCodeDescr { get; set; }
    public System.DateTime CreateDate { get; set; }
    public System.DateTime LastActivityDate { get; set; }
}

Мой контроллер работал нормально, когда все было GUID, а Id был сопоставлен с CodeId (PK таблицы) и т. Д.

    public ViewResult BarCode(Guid id)
    {
        Code code = db.Codes.Find(id);
        return View(code);
    }

Сейчас я пытаюсь сделать что-то вроде этого:

    public ViewResult BarCode(int serialid)
    {
        Code code = db.Codes.Find(serialid);
        return View(code);
    }

или это...

    public ActionResult QRCode(int serialid)
    {
        ViewData["SerialId"] = serialid;
        return View(db.Codes.Where(x => x.SerialId == serialid).ToList());
    }

... только все мои попытки приводят к одной и той же ошибке:

 The parameters dictionary contains a null entry for parameter 'serialid' 
 of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult 
 BarCode(Int32)' in 'MyProject.Controllers.HomeController'. An optional parameter 
 must be a reference type, a nullable type, or be declared as an optional parameter.
 Parameter name: parameters 

Что я делаю неправильно? Не идеально, чтобы мое представление возвращало запись, основанную на поиске определенного SerialId вместо CodeId, но это должно быть выполнимо, верно?


person edward_h    schedule 20.04.2012    source источник


Ответы (1)


Вы пробуете использовать необязательный параметр?

public ViewResult BarCode(int serialid = 0)
    {
        Code code = db.Codes.Find(serialid);
        return View(code);
    }
person Christopher Rathermel    schedule 20.04.2012
comment
Хм, нет, для меня это новая идея. Пытаясь это сделать, я получил другую ошибку: {Тип одного из значений первичного ключа не соответствует типу, определенному в сущности. См. Подробности во внутреннем исключении. \ R \ nParameter name: keyValues} {Типы аргументов 'Edm.Guid' и 'Edm.Int32' несовместимы для этой операции. Рядом с предикатом WHERE, строка 1, столбец 70.} ... который, кажется, говорит, что он все еще пытается вернуть представление, предполагая, что значение будет соответствовать CodeId / GUID. - person edward_h; 21.04.2012
comment
Дважды проверьте тип столбца базы данных и, возможно, попытайтесь обновить, если вы используете Entity Framework с файлом .edmx. - person Christopher Rathermel; 21.04.2012
comment
Хорошо, я дважды проверил, и это определенно SerialId (INT) с включенной идентификационной вставкой. И .edmx обновляется. Без изменений; Затем я попробовал общедоступный ViewResult BarCode (int? Serialid = 0) с? после int, и появилась новая ошибка о правильно идентифицированных значениях PK (который SerialId не является PK, а CodeId является.) {Тип одного из значений первичного ключа не соответствует типу, определенному в сущности. Подробнее см. Внутреннее исключение. \ R \ nParameter name: keyValues} Внутреннее исключение такое же: где Edm.Guid и Edm.Int32 несовместимы. Мой ViewResult пытается заставить ПК войти в INT? - person edward_h; 22.04.2012
comment
Возможно, вы захотите пересобрать или удалить файлы в папках bin и obj или удалить файл .edmx и повторно добавить его. Создание нового проекта / решения с вашим кодом изолированно, чтобы увидеть, есть ли другая зависимость, вызывающая проблему. - person Christopher Rathermel; 24.04.2012
comment
Кристофер, спасибо за вашу помощь. Я не уверен, что это разрешимо, как я это делаю; Я прошу разрешения изменить идентификатор с GUID на INT и напрямую займусь проблемой. - person edward_h; 24.04.2012