传递清单<>作为视图和控制器之间的参数

时间:2014-05-07 17:46:22

标签: c# linq asp.net-mvc-3 asp.net-ajax

我继承了一个按搜索字词过滤的网格。构建它的人将搜索项添加到模型中,以使它们更容易在整个过程中通过。当搜索术语是一个简单的字符串时,一切似乎都能正常工作,但要将它重构为List<>考虑多个搜索字词。在视图页面上显示“searchterms”,但是当它到达控制器时,它不再是正确的值,它显示为“System.Collections.Generic.List`1 [System.String]”,而不是价值,然后在过程的其余部分。从那里我尝试使用从SO获得的Linq按搜索条件过滤列表。如果可以,请告知并提前致谢。

观点:

  <%              
var filePath = Model.FullPath;
var searchterms = new List<string>();
searchterms = Model.SearchTrms;

Html.Telerik().Grid<FileModel>()
    .Name("DocumentsGrid")
    .DataKeys(key => key.Add(x => x.FullPath))
    .Columns(columns =>
    {
        columns.Bound(x => x.FullPath).Format("<input type='checkbox'  value='{0}'>").Encoded(false).Width(22).Title("");
        ...

    })
    .DataBinding(dataBinding => dataBinding.Ajax()
                .Select("MyGridAction", "MyController", new { filePath  , searchterms })
                )
    ...
    .Render();
%>

模特:

  public class FileModel
{
       ...

    public string FullName { get; private set; }
       ...
    public string Description { get;   set; }

    public List<string> SearchTrms  { get;   set; }

    public IList<FileModel> SubFolders { get; set; }
       ...

}
控制器:

    [GridAction]
    public ActionResult MyGridAction(string filePath, List<string> searchterms)
    {
      ...

  dbfiles = GetFiles(userName, searchterms);

      ...

}



   public List<File> GetFiles(string userName, List<string> searchterms)
    {
        using (DBEntities ode = new DBEntities())
        {
            ode.ContextOptions.LazyLoadingEnabled = false;
            List<File> fileset1 = (from p in ode.aspnet_Users
                                   from q in p.Files
                                   where p.UserName == userName
                                   select q).ToList<File>();


            List<File> filteredlist = (from f in fileset1
                                       from s in searchterms
                                       where f.Name.Contains(s)
                                       select f).ToList<File>();

            return filteredlist;
        }
    }

如果需要,我会很乐意发布更多信息。

1 个答案:

答案 0 :(得分:1)

您之所以看到"System.Collections.Generic.List'1[System.String]"是因为这是listOfStrings.ToString()返回的原因。当您使用匿名类型new { ... }填充路线值时,会调用哪个。

你需要按照

的方式做点什么
var routeValues = new RouteValueDictionary();

routeValues.Add("filePath", filePath);

for (int i = 0; i < searchTerms.Count(); i++)
{
    var key = String.Format("searchTerms[{0}]", i);
    routeValues.Add(key, searchTerms[i]);
}

// ...

.DataBinding(dataBinding => dataBinding.Ajax()
    .Select("MyGridAction", "MyController", routeValues)) 
// don't have a compiler with me so this may be the wrong overload

// ...

这意味着每个单独的项目都有自己的密钥,因此模型绑定器可以很好地使用它。

有关详情,请参阅this blog post by Scott Hanselman