我有一个带有简单表格和高级搜索表单的页面。我传递List<Customers>
给模型:
View(List<Customers>);
那么将数据传递和返回到搜索表单的最佳方式是什么?我想使用验证或其他东西,但我认为传递数据ViewData
不是一个好主意。有什么建议么?
我有一个带有简单表格和高级搜索表单的页面。我传递List<Customers>
给模型:
View(List<Customers>);
那么将数据传递和返回到搜索表单的最佳方式是什么?我想使用验证或其他东西,但我认为传递数据ViewData
不是一个好主意。有什么建议么?
您应该将视图所需的所有数据包装在特定于该视图的模型中。这样做的好处是您还可以在模型中包含您的搜索条件,该条件起初是空的,但是当您的搜索发布时,模型会自动包含您的搜索条件,因此您可以在传回结果时重新加载它。这也将有助于保持您在帖子之间的状态。
这也允许您的所有视图数据在不安全的地方是类型安全的ViewData
。
例如:
public class CustomerSearchViewModel
{
public List<Customer> Customers { get; set; }
// your search criteria if you want to include it
public string SearchFirstName { get; set; }
public string SearchLastName { get; set; }
public int SearchCustomerID { get; set; }
// etc...
}
当您返回时List<Customer>
,搜索条件已经从帖子中填充到您的模型中,因此您的视图可以将搜索条件默认返回相应的控件(假设您的搜索结果和搜索输入控件位于同一视图上)。
例如,在您的帖子中,您会接受一个CustomerSearchViewModel
. 然后您需要做的就是获取您的客户列表并将其添加回模型并返回相同的模型。
// assuming you have accepted a CustomerSearchViewModel named model
model.Customers = GetCustomersForSearchCriteria(model.SearchFirstName,
model.SearchLastName, model.SearchCustomerID);
return View(model);
您还可以将验证属性添加到模型属性中,以利用 MVC 中的内置验证。ViewData
如果您用来传递这些数据,这是不可能的。
您还必须考虑“下一个人”。当视图所需的所有数据都位于单个类中时,它会更干净。这样他们就不必搜索代码来发现是否ViewData
正在使用以及实际上在其中传递了哪些数据。
ViewData
仍然是传递数据的一种选择,但如果可能的话,我会尽量减少它的使用。
与其将项目列表传递给您的视图,不如创建一个包含项目列表和您可能需要的任何其他数据的类,即 ViewModel。
public class CustomerSearchViewModel {
public IEnumerable<Customer> Customers { get; set; }
public string SearchTerm { get; set; }
}
.....
var viewModel = new CustomerSearchViewModel {
Customers = customerList,
SearchTerm = searchTerm
};
return View(viewModel);