Не уверен, как решить мою System.NullReferenceException - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть представление индекса (списка) в MVC5, которое заполняется из модели (таблица ICS_Supplies).

Я добавил текстовое поле для добавления фильтра поиска для пользователей в поле ItemDescription (varchar).Это прекрасно работает следующим образом:

Вид

<form asp-controller="Movies" asp-action="Index">
  <p>
    Search Supplies: <input type="text" name="SearchString">
    <input type="submit" value="Filter" />
  </p>
</form>

Контроллер

public ActionResult Index(string searchString, string SType, int? page, string YourRadioButton)
{
    // Add SearchBox Filter
    var catalogs = supplies.Where(s =>  s.ItemDescription.Contains(searchString ?? string.Empty));

    // Add paging to the search results
    var pageNumber = page ?? 1;
    return View(catalogs.ToPagedList(pageNumber, 10));
}

Это прекрасно работает.Если searchString имеет значение null, он возвращает ВСЕ результаты.Если searchSring имеет значение, он возвращает любые результаты, когда ItemDescription Cotain значение searchString.

Я пытаюсь добавить радиокнопку в индексное представление, чтобы пользователь также мог фильтровать поле InvType, котороеполе char (1).Это может быть F (для форм) или S (для припасов).Итак, я установил значение YourRadioButton в F или S в зависимости от того, какой из них выбран.,,следующим образом (с новым кодом)

Индекс

<form asp-controller="Movies" asp-action="Index">
  <div>
    Supplies: @Html.RadioButton("YourRadioButton", "S")
    Forms: @Html.RadioButton("YourRadioButton", "F")
  </div>
  <p>
    Search Supplies: <input type="text" name="SearchString">
    <input type="submit" value="Filter" />
  </p>
</form>

И я обновляю Контроллер дополнительным кодом следующим образом:

public ActionResult Index(string searchString, string SType, int? page, string YourRadioButton)
{
    var supplies = db.ICS_Supplies.OrderBy(g => g.ItemDescription).ToList();

    //var supplies2 = supplies.Where(s => s.InvType.Equals(mychoice));
    var supplies2 = supplies.Where(s => s.InvType.Contains(YourRadioButton ?? string.Empty));

    // Add SearchBox Filter
    var catalogs = supplies2.Where(s =>  s.ItemDescription.Contains(searchString ?? string.Empty));

    // Add paging to the search results
    var pageNumber = page ?? 1;
    return View(supplies2.ToPagedList(pageNumber, 10));
}

Теперь я получаю следующееошибка

System.NullReferenceException

И это относится к следующей строке кода (которую я добавил)

var supplies2 = supplies.Where(s => s.InvType.Contains(YourRadioButton ?? string.Empty));

Мои вопросы.,,Почему это исключает NullReferenceException, но другая строка прекрасно работает, если она пуста?И как мне решить проблему - или есть лучший способ добавить этот второй фильтр в мой код?

Эта строка работает нормально, ноль или нет.Они оба идентичны в том, как они написаны, за исключением того, что используется значение YourRadioButton вместо searchString, и я использую поле InvType вместо ItemDescription.

var catalogs = supplies2.Where(s => s.ItemDescription.Contains(searchString ?? string.Empty));

Имейте в виду, что я ОЧЕНЬ новичок в MVC5 и C #, и поэтому объясняю, почему это сильно помогло бы мне прогрессировать.

Похоже, что информации об использовании радиокнопок в MVC5 не так много.,,довольно простая концепция в старых формах Asp.net.

1 Ответ

2 голосов
/ 30 апреля 2019

Кажется, что некоторые записи suppliers не имеют InvType.Иногда это свойство имеет значение null, поэтому вы получаете исключение NullReferenceException, поскольку вы вызываете метод Contains() для свойства со значением NULL.

Проблема не возникает в вашем первом примере, поскольку вы использовали Linq to Entities.Во втором примере вы вызываете ToList () после первого запроса.После этого все будет продолжать работать в памяти (Linq to Objects).Затем вы должны проверить на нулевое условие в любом месте:

var supplies2 = supplies.Where(s => s.InvType != null && s.InvType.Contains(YourRadioButton ?? string.Empty));

Я думаю, что лучше удалить ToList() из первого запроса.Добавьте к нему условия where и позвольте PagedList выполнить запрос за вас:

public ActionResult Index(string searchString, string SType, int? page, string YourRadioButton)
{
     var supplies = db.ICS_Supplies.AsQueryable();

     if (!String.IsNullOrWhiteSpace(YourRadioButton))
     {
         supplies = supplies.Where(s => s.InvType.Contains(YourRadioButton));
     }

     if (!String.IsNullOrWhiteSpace(searchString))
     {
         supplies = supplies.Where(s =>  s.ItemDescription.Contains(searchString));
     }

     supplies = supplies.OrderBy(g => g.ItemDescription)

     // Add paging to the search results
     var pageNumber = page ?? 1;
     return View(supplies.ToPagedList(pageNumber, 10));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...