在同一页面显示搜索表单及其结果的最佳方式?

时间:2011-05-04 17:59:36

标签: asp.net-mvc asp.net-mvc-3

假设我有一个带文本框的简单搜索表单。在提交表单后,我将文本框的内容发送到存储过程,然后返回给我结果。我希望结果显示在表单的同一页面上,除了它下面。

现在我正在做以下事情,但它并没有按照我想要的方式运作:

我的SearchController的“索引”视图

@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中的一些最佳实践。

3 个答案:

答案 0 :(得分:3)

您可以在ViewData对象中返回结果,然后仅在视图中显示not null

答案 1 :(得分:3)

非常类似于这个问题MVC 3 form post and persisting model data

对于此实例,您似乎没有将结果传递给局部视图。试试这个?

@{ Html.RenderPartial("SearchResults", Model.Results);

答案 2 :(得分:1)

由于您没有使用模型保存搜索信息,因此搜索表单发布时搜索信息将会丢失。

鉴于您的设计和既定目标,最好将索引视图中的表单转换为Ajax表单,然后您的控制器可以将您的部分视图发送回来填充Ajax表单下方的div。

counsellorben