[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视图中有一个下拉列,如图所示。
答案 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发布数据并返回网格的局部视图,以避免重新呈现整个页面