我使用mvc3,我有空搜索表单,只使用带搜索按钮的文本框,如果用户搜索数据并单击搜索按钮,则必须显示从索引视图中获取的结果。 这是我的控制器动作
public ActionResult Search(string searchString)
{
var certificate = from s in db.certificate_mst
select s;
if (!String.IsNullOrEmpty(searchString))
{
certificate = certificate.Where(s => s.CertificateNo.Contains(searchString));
}
return View(certificate);
}
我的观看代码是
@using (Html.BeginForm("Search","certificate1",FormMethod.Get))
{
<p><b>CertificateNo</b>:@Html.TextBox("searchString")
<input type="submit" value="search" />
通过使用此代码,搜索正在运行但是我在搜索之前获取了我在视图中的所有数据,我需要在单击搜索按钮之前使用空表单,并且只有在我单击搜索之后才需要显示结果。
答案 0 :(得分:3)
在检索证书之前,只需检查空字符串
public ActionResult Search(string searchString)
{
if (String.IsNullOrEmpty(searchString))
{
//Return empty viewModel
return View();
}
var certificate = db.certificate_mst.Where(s => s.CertificateNo.Contains(searchString));
return View(certificate);
}
还查看我在IQueryable的搜索扩展方法上写的博客文章应该对你有所帮助
http://www.ninjanye.co.uk/2013/03/c-generic-search-extension-method-for.html
http://jnye.co/Posts/6/c%23-generic-search-extension-method-for-iqueryable
使用扩展方法,您的代码变为......
var certificate = db.certificate_mst.Search(s => s.CertificateNo, searchString));
首选方法是将视图拆分为get和post操作,如下所示。这允许您在发布空字符串时返回所有结果:
public ActionResult Search()
{
return View();
}
[HttpPost]
public ActionResult Search(string searchString)
{
var certificate = db.certificate_mst.Where(s => s.CertificateNo.Contains(searchString));
//OR
//var certificate = db.certificate_mst.Search(s => s.CertificateNo, searchString));
return View(certificate);
}
答案 1 :(得分:1)
尝试在搜索屏幕中使用视图模型,以备日后在搜索中添加更多过滤项目时使用。然后,您将没有每个搜索过滤器的参数,只有一个参数,即您的视图模型。你现在拥有它的方式现在也有效,下面只是一种替代方法。
视图模型可能如下所示:
public class SearchViewModel
{
public string SearchString { get; set; }
// Other filter items if you need anything else
}
您的控制器的操作方法
public ActionResult Search()
{
SearchViewModel viewModel = new SearchViewModel();
return View(viewModel);
}
从控制器中删除您的数据访问权限并通过服务层或存储库工作:
[HttpPost]
public ActionResult Search(SearchViewModel viewModel)
{
// Check for null viewModel
if (!ModelState.IsValid)
{
// A possible failed validation is when no search string was entered,
// and then you don't want to do any database calls.
// Just pass back the view model and let the view handle the displaying of errors
return View(viewModel);
}
// If validation succeeds now you can use your search string to retrieve data
searchService.Search(viewModel.SearchString);
// Do what else you need to do and the return the correct view
return View();
}
您的搜索视图可能如下所示:
@model YourProject.ViewModels.Searches.SearchViewModel
@using (Html.BeginForm())
{
@Html.TextBoxFor(x => x.SearchString)
@Html.ValidationMessageFor(x => x.SearchString)
<button id="searchButton" type="submit">Search</button>
}
我希望现在更有意义。