【问题标题】:ASP.NET MVC - Taking search criteria as input, and displaying the results, in the same ViewASP.NET MVC - 将搜索条件作为输入,并在同一个视图中显示结果
【发布时间】:2018-01-14 14:42:49
【问题描述】:

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

如何来回传递各种数据?

选项 1 - 创建一个单一的视图模型类,它有 10 个属性(每个条件一个)和一个保存结果的第 11 个属性(一个列表)。 据我了解,当用户单击提交时,模型中的值将被传回服务器(这就是服务器获取标准值的方式)。这是否意味着这 1000 行也全部传回?

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

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

【问题讨论】:

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


    【解决方案1】:

    选择选项 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>();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-07-13
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2020-07-24
      • 2021-09-24
      相关资源
      最近更新 更多