MVC空查询字符串参数奇怪的行为

时间:2016-11-29 10:36:33

标签: c# asp.net-mvc unit-testing model-binding

我正在尝试通过将关键字作为参数传递给控制器​​操作来实现搜索,如下所示:

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个联系人,当我没有传递查询参数时,我可以看到所有这些联系人。如果您能指出控制器操作返回空列表的原因,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

将空字符串传递给查询参数时,条件 if(query!=null)失败,下面的行

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

执行,它会检查数据库中LastName中是否有空字符串的条目。这种情况永远不会得到满足,因此您的列表会被一个空列表覆盖。

答案 1 :(得分:2)

if (query != null)更改为if (!string.IsNullOrEmpty(query))