【问题标题】:Passing List<> as parameter between view and controller在视图和控制器之间传递 List<> 作为参数
【发布时间】:2014-05-07 17:46:21
【问题描述】:

我继承了一个按搜索词过滤的网格。构建它的人将搜索词添加到模型中,以使它们更容易在整个过程中传递。当搜索词是一个简单的字符串时,一切似乎都可以正常工作,但是将其重构为 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;
        }
    }

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

【问题讨论】:

  • 我希望我了解如何应用任何“可能重复”的响应。
  • @user116923 您能否确认您在哪里看到"System.Collections.Generic.List1[System.String]"`?
  • 在视图中,".Select("MyGridAction", "MyController", new { filePath , searchterms })" searchterms 在本地输出窗口中显示正确的值。在控制器中,“public ActionResult MyGridAction(string filePath, List searchterms)”显示文本“System.Collections.Generic.List1[System.String]”作为searchterms的值

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


【解决方案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

【讨论】:

  • 我不太了解 Scott Hanselman 的帖子,但这很有效,而且似乎很有意义。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多