2016-11-29 6 views
1

Я пытаюсь осуществить поиск путем передачи ключевого слова в контроллер действия в качестве параметра, как показано ниже:MVC пустой параметр строки запроса странное поведение

public ActionResult Index(string query) 
{ 
    var contacts = _unitOfWork.Contacts.GetContacts(_user.Id, query); 
    var viewModel = contacts.Select(Mapper.Map<Contact, ContactViewModel>); 
    return View("Index", viewModel); 
} 

GetContacts функция в хранилище выглядит следующим образом:

public IEnumerable<Contact> GetContacts(int userId, string query = null) 
{ 
    var list = _context.Contacts 
        .Where(c => c.UserId == userId) 
        .OrderBy(c => c.FirstName) 
        .AsQueryable(); 

    if (query != null) 
     list = list.Where(c => c.FirstName.ToLower().Contains(query.ToLower()) 
     || c.LastName.ToLower().Contains(query.ToLower())); 

    return list.ToList(); 
} 

Когда я перехожу к http://localhost:50139/contacts/index?query=, я получаю пустой список. Пройдя через код, очевидно, что параметр query преобразуется в пустое строковое значение. Для обеспечения поиска работы, у меня есть следующие тесты и все они проходят:

GetContacts_SearchByFirstName_ShouldReturnFilteredList 
GetContacts_SearchByLastName_ShouldReturnFilteredList 
GetContacts_SearchWithCapitalLetters_ShouldReturnFilteredList 
GetContacts_SearchWithNullQuery_ShouldReturnAllContacts 

В частности, следующий тест запускает функцию с пустой строкой, которая также проходит успешно.

[TestMethod] 
public void GetContacts_SearchWithEmptyString_ShouldReturnAllContacts() 
{ 
    var contactList = new List<Contact>() 
    { 
     // Construct new contact with first and last name and associated user id. 
     new Contact("e", "b",_userId), 
     new Contact("c", "b",_userId), 
     new Contact("a", "b",_userId), 
     new Contact("d", "b",_userId) 
    }; 

    _mockContacts.SetSource(contactList); 

    var result = _repository.GetContacts(_userId, ""); 

    result.Count().Should().Be(4); 
} 

У меня есть 3 контакта в базе данных, и я могу видеть их, когда я не передать параметр запроса. Я был бы признателен, если бы вы могли указать, почему действие контроллера возвращает пустой список.

+0

Попробуйте использовать String.IsNullOrEmpty вместо запроса! = NULL –

ответ

2

Когда вы передаете пустую строку в параметре запроса, условие if(query!=null) терпит неудачу, и линия ниже этого

list = list.Where(c => c.FirstName.ToLower().Contains(query.ToLower()) 
      || c.LastName.ToLower().Contains(query.ToLower())); 

запускается на выполнение, который проверяет базу данных для записи с пустой строкой в ​​LastName. Это условие никогда не будет удовлетворено, и, следовательно, ваш список будет переопределен пустым списком.

2

изменение if (query != null) в if (!string.IsNullOrEmpty(query))

+0

Возникает вопрос _why действие контроллер возвращает пустой список? _ –

+0

@StephenMuecke Да и ответ из-за неправильного, если заявление. – esiprogrammer

+0

Нет, ОП заявляет, что их единичные тестовые пропуски (но я подозреваю, что их требование неверно, потому что я могу повторить его) –