2016-11-29 1 views
1

Je suis en train de mettre en œuvre la recherche en passant le mot-clé au contrôleur action en tant que paramètre comme indiqué ci-dessous:MVC paramètre de chaîne de requête vide comportement étrange

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); 
} 

fonction GetContacts dans le référentiel se présente comme suit:

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(); 
} 

Lorsque je navigue vers http://localhost:50139/contacts/index?query=, j'obtiens une liste vide. Après avoir parcouru le code, il est évident que le paramètre query est converti en une valeur de chaîne vide. Pour assurer les travaux de recherche, j'ai les tests suivants et tous les passe:

GetContacts_SearchByFirstName_ShouldReturnFilteredList 
GetContacts_SearchByLastName_ShouldReturnFilteredList 
GetContacts_SearchWithCapitalLetters_ShouldReturnFilteredList 
GetContacts_SearchWithNullQuery_ShouldReturnAllContacts 

En particulier, le test suivant exécute la fonction avec une chaîne vide, qui passe aussi avec succès.

[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); 
} 

J'ai 3 contacts dans la base de données et je peux tous les voir quand je ne passe pas le paramètre de requête. J'apprécierais si vous pourriez indiquer pourquoi l'action de contrôleur renvoie une liste vide.

+0

Essayez d'utiliser String.IsNullOrEmpty au lieu de requête! = Null –

Répondre

2

Lorsque vous passez une chaîne vide au paramètre de requête, la condition if(query!=null) échoue et la ligne ci-dessous que

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

est exécuté, qui vérifie la base de données pour une entrée avec une chaîne vide dans le LastName. Cette condition n'est jamais satisfaite et votre liste est donc remplacée par une liste vide.

2

changement if (query != null)-if (!string.IsNullOrEmpty(query))

+0

La question est _why l'action du contrôleur renvoie une liste vide? _ –

+0

@StephenMuecke Oui et la réponse est à cause de mauvaise instruction if. – esiprogrammer

+0

Non, OP prétend que ses tests unitaires réussissent (mais je soupçonne que leur demande est fausse parce que je peux la répéter) –