使用此视图,我可以过滤数据库中的记录。每个"过滤器"是SearchViewModel
,它具有如下的类定义:
public class SearchViewModel
{
//Property has a property called "SqlColumnName"
public Property Property { get; set; }
public Enums.SearchOperator Operator { get; set; }
public string Value { get; set; }
}
我现在正在尝试找到一个解决方案,如何构建此网站的动作链接并传入List<SearchViewModel>()
。
所以我试图完成这样的事情:
http://url/Index?property=Typ&Operator=2&Value=4&property=ServerName&Operator=1&Value=server
我试图用http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/来解决我的问题,但是这个人正在用POST调用Action,我需要用GET请求调用它。
那么如何使用actionlink将对象列表传递给mvc控制器动作?
修改
我想我需要说,POST请求不是一个选项,因为我需要div元素的onClick事件中的链接。
答案 0 :(得分:0)
您可以构建一个包含以下参数的链接:
http://url/Index?%5B0%5D0.property=Typ&%5B0%5D0.Operator=2&%5B0%5D0.Value=4&%5B1%5D0.property=ServerName&%5B1%5D0.Operator=1&%5B1%5D0.Value=server
另请注意,查询字符串参数的长度存在限制。这些限制因浏览器而异。因此,这可能是一种更好的方法,只需生成一个带有id的链接,该链接允许您在服务器上(从数据存储区)检索相应的集合:
http://url/Index?id=123
答案 1 :(得分:0)
ActionLink
辅助方法呈现锚标记。可以通过链接传递几个查询字符串项。请记住查询字符串has a limit,了解您可以传递多少数据,因浏览器而异。
你应该做的是表格发布。您可以借助一些小的javascript在div上的点击事件上进行表单发布。
让我们为搜索页面创建一个新的视图模型
public class SearchVm
{
public List<SelectListItem> Operators { set; get; }
public List<SearchViewModel> Filters { set; get; }
}
public class SearchViewModel
{
//Property has a property called "SqlColumnName"
public Property Property { get; set; }
public SearchOperator Operator { get; set; }
public string Value { get; set; }
}
因此,在您的GET操作中,您将向视图发送SearchViewModel
列表。
public ActionResult Index()
{
var search = new SearchVm
{
Filters = new List<SearchViewModel>
{
new SearchViewModel {Property = new Property {SqlColumn = "Name"}},
new SearchViewModel {Property = new Property {SqlColumn = "Age"}},
new SearchViewModel {Property = new Property {SqlColumn = "Location"}}
}
};
//Convert the Enums to a List of SelectListItem
search.Operators= Enum.GetValues(typeof(SearchOperator)).Cast<SearchOperator>()
.Select(v => new SelectListItem
{
Text = v.ToString(),
Value = ((int)v).ToString()
}).ToList();
return View(search);
}
在您的SearchVm
视图模型中强类型的视图中,我们将操作表单字段名称,以便在提交表单时模型绑定可以正常工作。
@model SearchVm
@using (Html.BeginForm())
{
var i = 0;
foreach (var criteria in Model.Filters)
{
<label>@criteria.Property.SqlColumn</label>
@Html.HiddenFor(f => f.Filters[i].Property.SqlColumn)
@Html.DropDownList("Filters[" + i+ "].Operator",Model.Operators)
@Html.TextBoxFor(f=>f.Filters[i].Value)
i++;
}
<div id="someDiv">Search button using Div</div>
<input type="submit" value="Search" />
}
你的HttpPost动作方法来处理表单提交。
[HttpPost]
public ActionResult Index(SearchVm model)
{
foreach(var f in model.Filters)
{
//check f.Property.SqlColumn, f.Value & f.Operator
}
// to do :Return something useful
}
如果您希望在div上的click事件上提交表单,请侦听特定div上的click事件,并在div所在的表单上调用submit方法。
<script>
$(function () {
$("#someDiv").click(function(e) {
$(this).closest("form").submit();
});
});
</script>