Serialization 序列化列表<;过滤器>;用于在MVC5中存储隐藏字段

Serialization 序列化列表<;过滤器>;用于在MVC5中存储隐藏字段,serialization,asp.net-mvc-5,Serialization,Asp.net Mvc 5,我想序列化ColumnFilter对象列表,以便将其存储在隐藏字段中。隐藏字段的代码如下所示在这种情况下,如何在控制器操作中序列化此列表? [Serializable] public class ColumnFilter { public string FieldName { get; set; } public string FieldType { get; set; } public string DynamicFilter { get; set; } pub

我想序列化ColumnFilter对象列表,以便将其存储在隐藏字段中。隐藏字段的代码如下所示在这种情况下,如何在控制器操作中序列化此列表?

[Serializable]
public class ColumnFilter
{
    public string FieldName { get; set; }
    public string FieldType { get; set; }
    public string DynamicFilter { get; set; }
    public object Value { get; set; }

    public ColumnFilter() {}

    public ColumnFilter (string fieldName, string fieldType,string  dynamicFilter, object value)
    {
        this.FieldName = fieldName;
        this.DynamicFilter = dynamicFilter;
        this.Value = value;
        this.FieldType =  fieldType;
    }
}
@Html.DropDownList(“搜索字段”,“IEnumerable”)视图数据[“搜索字段])
@Html.DropDownList(“SearchCondition”,(IEnumerable)ViewData[“SearchConditions”])
@TextBox(“SearchText”,(字符串)ViewBag.SearchText)
@隐藏(“ColumnFilters”,ViewBag.ColumnFilters)
我在相应的MVC视图中有一个列下拉列表,如图所示


要将
ColumnFilter
的集合呈现为隐藏输入,请使用
for
循环或
编辑器模板
。我强烈建议您为此使用视图模型,我的答案基于此

视图模型

@Html.DropDownList("SearchField", (IEnumerable<SelectListItem>)ViewData["SearchFields"])
@Html.DropDownList("SearchCondition", (IEnumerable<SelectListItem>)ViewData["SearchConditions"])
@Html.TextBox("SearchText", (string)ViewBag.SearchText)
<input type="submit" value="Search" name="command" class="btn btn-default" />
<input type="submit" value="Show All" name="command" class="btn btn-default" />
@Html.Hidden("ColumnFilters", ViewBag.ColumnFilters)
控制器

@model YourAssembly.FilterViewModel
.....
@Html.DropDownListFor(m => m.SearchField, Model.SearchFieldList)
@Html.DropDownListFor(m => m.SearchCondition, Model.SearchConditionList)
@Html.TextBoxFor(m => m.SearchText)
....
// render hidden inputs for each current searc filter
@for(int i = 0; i < Model.CurrentFilters.Count; i++)
{
  @Html.HiddenFor(m => m.CurrentFilters[i].FieldName)
  @Html.HiddenFor(m => m.CurrentFilters[i].FieldType)
  ... // other properties of SearchFilter
}
模型现在由用户选择的值和当前过滤器的集合填充。 注意:如果返回视图(即
ModelState
无效),则需要重新指定
SelectList
属性


如果当前有很多筛选器,那么您将向客户端发送大量额外数据,然后将其全部发回。为了提高性能,最好将当前筛选器存储在会话中。可能还值得考虑使用AJAX发布数据并返回网格的部分视图,以避免重新呈现整个页面

为什么要发送所有额外数据并将其发回
ColumnFilter
没有无参数构造函数,因此集合无论如何都将为null OK。我将添加空构造函数。我想维护应用于网格的过滤器列表,这样用户提交的任何新过滤器都将应用于所有以前的过滤器。否则,用户一次只能应用一个筛选器。我不确定我是否理解,但“序列化”列表会有什么帮助。如果您确实需要客户端上的集合,请在
for
循环中为每个属性添加隐藏输入,或为类型
ColumnFilte
创建一个编辑器模板(每个属性都有隐藏输入),并在用户单击搜索按钮时使用
@Html.EditorFor(m=>m.YourCollection)
,我可以通过反序列化隐藏字段值来获取所有以前的过滤器。我的项目中已经有C#代码,可以从给定列表集合的数据库中获取筛选列表。我可以使用“运算符”下拉列表和“值”文本框选择列并指定其筛选器,然后单击“搜索”。我的帖子中显示了一个屏幕截图,所以我可以选择OrderID并通过点击搜索按钮提交一个过滤器。然后,我将通过该过滤器过滤网格。接下来,从最左边的下拉列表中选择ProductID列并指定另一个过滤器,然后单击搜索。现在新的过滤器以及OrderID上的第一个过滤器将应用于网格。
@model YourAssembly.FilterViewModel
.....
@Html.DropDownListFor(m => m.SearchField, Model.SearchFieldList)
@Html.DropDownListFor(m => m.SearchCondition, Model.SearchConditionList)
@Html.TextBoxFor(m => m.SearchText)
....
// render hidden inputs for each current searc filter
@for(int i = 0; i < Model.CurrentFilters.Count; i++)
{
  @Html.HiddenFor(m => m.CurrentFilters[i].FieldName)
  @Html.HiddenFor(m => m.CurrentFilters[i].FieldType)
  ... // other properties of SearchFilter
}
[HttpPost]
public ActionResult Search(FilterViewModel model, string command)
{
  ....