假设我有一个带有文本框的简单搜索表单。提交表单后,我将文本框的内容发送给存储过程,存储过程将返回结果。我希望结果显示在同一页的形式,只是下面。
现在我正在做下面的事情,但是它并没有完全按照我想要的方式工作:
我的SearchController的"Index"视图
@using (Html.BeginForm("SearchResults", "Search", FormMethod.Post, new { @class = "searchform" }))`{
<fieldset>
<legend>Name</legend>
<div class="editor-label">
@Html.Label("Search")
</div>
<div class="editor-field">
@Html.TextBox("Name")
</div>
<input type="submit" value="Search" class="formbutton" />
</fieldset>
@{ Html.RenderPartial("SearchResults", null);
这是我的"SearchResults"视图:
@model IEnumerable<MyProject.Models.spSearchName_Result>
<table>
@foreach (var item in Model)
{
<tr>
<td>
@item.Name
</td>
</tr>
}
</table>
这是我的控制器:
// GET: /Search/SearchResult
[HttpPost]
public ActionResult SearchResult(FormCollection collection)
{
var result = myentity.spSearchName(collection["Name"]);
return PartialView("SearchResults", result);
}
我似乎只能得到结果显示在一个全新的页面(不被嵌入作为一个部分视图),或者我得到一个错误,当我加载搜索页面,因为没有结果(因为我还没有搜索)。
有更好的方法来实现我想要做的吗?我觉得我违背了MVC中的一些最佳实践
您可以在ViewData
对象中返回结果,然后仅在视图中显示它是not null
非常类似于这个问题MVC 3表单post和持久化模型数据
对于这个实例,看起来你没有将结果传递给你的局部视图。试试这个?
@{ Html.RenderPartial("SearchResults", Model.Results);
由于没有使用模型保存搜索信息,因此在发布搜索表单时搜索信息将丢失。
考虑到您的设计和既定目标,最好将Index视图中的表单转换为Ajax表单,然后控制器可以将部分视图发送回去,以填充Ajax表单下面的div。
counsellorben