在单个ASP.NET Razor视图中,我想显示10个文本框(用户将在其中输入各种搜索条件),然后当用户提交表单并且服务器处理操作时,我想显示得到相同的视图(我们假设可能需要显示大约1,000行)。除了结果之外,我还希望标准文本框填充用户之前选择的值(以便用户可以根据需要修改标准,然后再次单击“提交”)。
如何来回传递各种数据?
选项1 - 创建单个视图模型类,它具有10个属性(每个条件一个),以及保存结果的第11个属性(List)。 据我所知,当用户点击提交时,模型中的值将被传递回服务器(这就是服务器获取条件值的方式)。这是否意味着所有1,000行也被传回?
选项2 - 创建一个包含10个属性的视图模型类。使用ViewBag传递包含结果的List。因此,当用户单击“提交第二个项目”时,仅发送标准数据,而显示的行不会发送回服务器(因为它们未存储在模型中)。
还有其他方法吗?我应该使用哪种方法?
答案 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>();
}
}