ASP.NET MVC - 将搜索条件作为输入并在同一视图

时间:2018-01-14 14:42:49

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

在单个ASP.NET Razor视图中,我想显示10个文本框(用户将在其中输入各种搜索条件),然后当用户提交表单并且服务器处理操作时,我想显示得到相同的视图(我们假设可能需要显示大约1,000行)。除了结果之外,我还希望标准文本框填充用户之前选择的值(以便用户可以根据需要修改标准,然后再次单击“提交”)。

如何来回传递各种数据?

选项1 - 创建单个视图模型类,它具有10个属性(每个条件一个),以及保存结果的第11个属性(List)。 据我所知,当用户点击提交时,模型中的值将被传递回服务器(这就是服务器获取条件值的方式)。这是否意味着所有1,000行也被传回?

选项2 - 创建一个包含10个属性的视图模型类。使用ViewBag传递包含结果的List。因此,当用户单击“提交第二个项目”时,仅发送标准数据,而显示的行不会发送回服务器(因为它们未存储在模型中)。

还有其他方法吗?我应该使用哪种方法?

1 个答案:

答案 0 :(得分:0)

使用选项1:在这种情况下,我没有看到任何使用ViewBag的理由。只需将模型传递给控制器​​操作方法中的视图即可。

return View(model);

您有两种操作方法,都返回相同的视图。首次访问该页面时的一种方法:

[HttpGet]
public ActionResult Query()
{
    return View(new FormQueryModel())
}

...以及用户提交搜索条件时的另一个。这将运行查询并传递一个填充了视图结果的模型以显示它们。

[HttpPost]
public ActionResult Query(FormQueryModel model)
{
    var queryManager = new QueryManager(model);
    model.QueryResults = queryManager.GetResults();
    return View(model);
}

不,您不必再次将之前搜索的结果发回控制器。在我的情况下,我只是将结果留在表单标记之外,因此它不会被回发。但是,只要你不结合结果,你就可以了。

@model FormQueryModel
@using (Html.BeginForm("Query", "Home"))
{
    @Html.LabelFor(m => m.Age)
    @Html.TextBoxFor(m => m.Age)
    @Html.LabelFor(m => m.Country)
    @Html.TextBoxFor(m => m.Country)
}

@if (Model.QueryResults.Count > 0)
{
    @foreach (var result in Model.QueryResults)
    {
       //display results here
    }
}

此外,您需要添加一些分页,因为用户不会读取1000行。如果搜索返回太多行,则用户会添加更多过滤条件。

public class FormQueryModel
{
    public int PageSize { get; set; }

    [Display(Name = "Enter your age")]
    public int Age { get; set; }

    [Display(Name = "Enter your country")]
    public string Country { get; set; }

    public List<QueryResult> QueryResults { get; set; }

    public FormQueryModel()
    {
        this.QueryResults = new List<QueryResult>();
    }
}