Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将ViewBag中的某些对象传递给动作保留搜索、排序和分页选项_C#_Asp.net_.net_Asp.net Mvc_Routevalues - Fatal编程技术网

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
    技术的好处,请查看

  • 此需求的常见场景是,例如,显示搜索和排序结果的寻呼机的页面链接或网格的列链接。如果您在网格上使用这种技术,分页链接应该在请求之间保留搜索选项和排序选项。但是对于生成列标题链接,对于每个列,您应该使用不同的合适排序顺序和排序列;此外,对于名称等于当前排序列的列,排序顺序应与当前排序顺序相反。此外,列标题还应保留页面索引


我建议您阅读MVC的基本教程,了解如何在视图中创建GET和POST方法以及如何进行简单的数据操作。如果你不理解这个基本概念,那么认为你可以用.net mvc编写代码是不现实的。OP正在创建一个链接,他们希望在两个请求之间保留搜索选项和排序选项。例如,对于显示搜索和排序结果的寻呼机的页面链接或网格的列链接,这完全是一种常见的情况,例如,在创建包含排序链接的列或网格具有寻呼机的网格时。然后,当网格显示搜索的排序结果时,当用户单击另一列时,只应更改排序列并保留搜索条件,或者如果用户单击另一页,只应更改页码,排序选项和搜索条件都不是。OP正在创建链接,他们希望在两个请求之间保留搜索选项和排序选项。例如,对于显示搜索和排序结果的寻呼机的页面链接或网格的列链接,答案并不能解决代码的所有问题,但其重点是保留搜索、排序和分页选项。在这个问题中,路由值部分有点棘手,我向您展示了如何将一个对象与一些其他值混合以创建合适的路由值。如果您对答案有任何疑问,请告诉我:)谢谢您,雷扎您的示例帮助我找到了解决方案。欢迎您@KayGee高兴地听到它帮助您解决了问题:)
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);