MVC actionlink传递对象列表

时间:2016-01-04 15:38:14

标签: c# asp.net-mvc

我的观点如下:enter image description here

使用此视图,我可以过滤数据库中的记录。每个"过滤器"是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事件中的链接。

2 个答案:

答案 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>