我继承了一个按搜索字词过滤的网格。构建它的人将搜索项添加到模型中,以使它们更容易在整个过程中通过。当搜索术语是一个简单的字符串时,一切似乎都能正常工作,但要将它重构为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;
}
}
如果需要,我会很乐意发布更多信息。
答案 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。