MVC 空查询字符串参数奇怪的行为
MVC empty query string parameter strange behaviour
我正在尝试通过将关键字作为参数传递给控制器操作来实现搜索,如下所示:
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 个联系人,当我不传递查询参数时,我可以看到所有联系人。如果您能指出为什么控制器操作 returns 是一个空列表,我将不胜感激。
当您将空字符串传递给查询参数时,条件
if(query!=null)
失败,下面的行
list = list.Where(c => c.FirstName.ToLower().Contains(query.ToLower())
|| c.LastName.ToLower().Contains(query.ToLower()));
被执行,检查数据库中是否有 LastName
中包含空字符串的条目。此条件永远不会满足,因此您的列表会被空列表覆盖。
将if (query != null)
更改为if (!string.IsNullOrEmpty(query))
我正在尝试通过将关键字作为参数传递给控制器操作来实现搜索,如下所示:
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 个联系人,当我不传递查询参数时,我可以看到所有联系人。如果您能指出为什么控制器操作 returns 是一个空列表,我将不胜感激。
当您将空字符串传递给查询参数时,条件
if(query!=null)
失败,下面的行
list = list.Where(c => c.FirstName.ToLower().Contains(query.ToLower())
|| c.LastName.ToLower().Contains(query.ToLower()));
被执行,检查数据库中是否有 LastName
中包含空字符串的条目。此条件永远不会满足,因此您的列表会被空列表覆盖。
将if (query != null)
更改为if (!string.IsNullOrEmpty(query))