序列化List <filter>以存储MVC5中的隐藏字段</filter>

时间:2014-09-13 02:08:07

标签: serialization asp.net-mvc-5

[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;
    }
}

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

@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)

我在相应的MVC视图中有一个下拉列,如图所示。

Filtering on multiple columns in MVC

1 个答案:

答案 0 :(得分:1)

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

视图模型

public class FilterViewModel
{
  public string SearchField { get; set; }
  public string SearchCondition { get; set; }
  public string SearchText { get; set; }
  public List<ColumnFilter> CurrentFilters { get; set; }
  public SelectList SearchFieldList { get; set; }
  public SelectList SearchConditionList { get; set; }
}

在get方法中,指定这些属性的初始值,包括SelectList s

查看

@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)
{
  ....

模型现在填充了用户选择的值和当前过滤器的集合。 请注意,如果您返回视图(即ModelState无效),则需要重新分配SelectList属性。

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