C# 如何将ViewBag中的某些对象传递给动作保留搜索、排序和分页选项
我有一个视图,在分页列表中显示搜索和排序的结果。我将列标题添加为链接,使用户可以通过以下方式基于列进行排序:C# 如何将ViewBag中的某些对象传递给动作保留搜索、排序和分页选项,c#,asp.net,.net,asp.net-mvc,routevalues,C#,Asp.net,.net,Asp.net Mvc,Routevalues,我有一个视图,在分页列表中显示搜索和排序的结果。我将列标题添加为链接,使用户可以通过以下方式基于列进行排序: <tr> <th> @Html.ActionLink("Reference No", "Index", new { sortOrder = ViewBag.RefNoSortParm, currentFilter = ViewBag.CurrentFilter }) </th>
<tr>
<th>
@Html.ActionLink("Reference No", "Index",
new { sortOrder = ViewBag.RefNoSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
<th>
@Html.ActionLink("Category", "Index",
new { sortOrder = ViewBag.CatSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
... Some other columns
</tr>
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
@Html.PagedListPager(Model, page => Url.Action("Index",
new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
有人能帮忙吗?顺便说一句,我是MVC的新手。您无法将视图包中的值传递回控制器
相反,您应该在视图中使用模型绑定将信息传递给post方法。您可以在从viewbag读取后在querystring中传递筛选器值。假设您的
SearchTransacModel
类具有DATEDISPFROM
和OFFICERNAME
属性
public class SearchTransacModel
{
public string DATEDISPFROM { set; get; }
public string OFFICERNAME { set; get; }
}
您可以将这些值作为路由值发送,其中键是(SearchTransacModel类的)属性名,值是您拥有的值
@{
var filter = ViewBag.CurrentFilter as SearchTransacModel;
}
@Html.ActionLink("Reference No", "Index", new { sortOrder = ViewBag.RefNoSortParm,
DATEDISPFROM = filter!=null? filter.DATEDISPFROM:"",
OFFICERNAME = filter != null ? filter.OFFICERNAME : "" })
Model binder将能够将querystring值映射到您的currentFilter
对象
我建议您不要使用两个相同类型的参数(currentFilter&searchModel)。虽然可以使用ViewBag来实现您想要的功能,但它仍然不是为此而设计的
相反,您应该创建一个模型,并使用它与控制器和视图通信
更改并调整您的退货模式,使其更大一些
public TransactionsViewModel
{
public SearchTransacModel SearchModel { get; set; }
public List<TransacViewModel> TransactionList { get; set; }
}
公共事务视图模型
{
公共搜索TransacModel搜索模型{get;set;}
公共列表事务列表{get;set;}
}
现在,您可以停止使用ViewBag.currentFilter,只使用此型号。您可以使用以下操作:
public ActionResult Index(SearchModel searchModel, string sortColumn, string sortOrder)
{
ViewBag.SearchModel = searchModel;
ViewBag.SortColumn= sortColumn;
ViewBag.SortOrder = sortOrder;
var business = new BusinessLogic();
var model = business.Search(searchModel, sortColumn, sortOrder);
return View(model);
}
您可以通过这种方式简单地混合一些管线值。这样,将在请求之间保留搜索选项和排序选项:
@{
var routeValues = new RouteValueDictionary(ViewBag.SearchModel ?? new { });
routeValues["sortColumn"] = ViewBag.SortColumn;
routeValues["sortOrder"] = ViewBag.SortOrder;
}
@Html.ActionLink("Link Text", "Action", routeValues);
注意:
- 基于此答案中的想法,您可以简单地创建一个方法,该方法甚至可以混合两个对象来为您创建路线值
- 您还可以将排序选项封装在
类中,并将其放入SortOption
中,然后在模型绑定中使用它ViewBag
- 这将帮助您获得更动态、更清晰的排序代码
- 要进一步了解此类
和SearchModel
技术的好处,请查看BusinessLogic
- 此需求的常见场景是,例如,显示搜索和排序结果的寻呼机的页面链接或网格的列链接。如果您在网格上使用这种技术,分页链接应该在请求之间保留搜索选项和排序选项。但是对于生成列标题链接,对于每个列,您应该使用不同的合适排序顺序和排序列;此外,对于名称等于当前排序列的列,排序顺序应与当前排序顺序相反。此外,列标题还应保留页面索引
public ActionResult Index(SearchModel searchModel, string sortColumn, string sortOrder)
{
ViewBag.SearchModel = searchModel;
ViewBag.SortColumn= sortColumn;
ViewBag.SortOrder = sortOrder;
var business = new BusinessLogic();
var model = business.Search(searchModel, sortColumn, sortOrder);
return View(model);
}
@{
var routeValues = new RouteValueDictionary(ViewBag.SearchModel ?? new { });
routeValues["sortColumn"] = ViewBag.SortColumn;
routeValues["sortOrder"] = ViewBag.SortOrder;
}
@Html.ActionLink("Link Text", "Action", routeValues);