C# 通过列表<&燃气轮机;作为视图和控制器之间的参数
我继承了一个按搜索词过滤的网格。构建它的人将搜索词添加到模型中,以使它们更容易在整个过程中传递。当搜索词是一个简单的字符串时,一切似乎都正常工作,但要将其重构为一个列表以考虑多个搜索词。在视图页面上,“searchterms”应该显示,但当它到达控制器时,它不再是正确的值,而是显示为“System.Collections.Generic.List`1[System.String]”,而不是这些值,这会破坏进程的其余部分。从那里,我尝试使用从SO获得的Linq,通过搜索词过滤列表。如果可以,请告知,并提前感谢 观点:C# 通过列表<&燃气轮机;作为视图和控制器之间的参数,c#,linq,asp.net-mvc-3,asp.net-ajax,C#,Linq,Asp.net Mvc 3,Asp.net Ajax,我继承了一个按搜索词过滤的网格。构建它的人将搜索词添加到模型中,以使它们更容易在整个过程中传递。当搜索词是一个简单的字符串时,一切似乎都正常工作,但要将其重构为一个列表以考虑多个搜索词。在视图页面上,“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();
%>
key.Add(x=>x.FullPath))
.列(列=>
{
columns.Bound(x=>x.FullPath).Format(“”).Encoded(false).Width(22).Title(“”);
...
})
.DataBinding(DataBinding=>DataBinding.Ajax()
.Select(“MyGridAction”、“MyController”、新{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; }
...
}
公共类文件模型
{
...
公共字符串全名{get;private set;}
...
公共字符串说明{get;set;}
公共列表SearchTrms{get;set;}
公共IList子文件夹{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;
}
}
[GridAction]
公共操作结果MyGridAction(字符串文件路径,列表搜索术语)
{
...
dbfiles=GetFiles(用户名、搜索术语);
...
}
公共列表GetFiles(字符串用户名、列表搜索术语)
{
使用(DBEntities ode=newdbentities())
{
ode.ContextOptions.LazyLoadingEnabled=false;
列出fileset1=(来自ode.aspnet_用户中的p)
从p.文件中的q
其中p.UserName==用户名
选择q.ToList();
List filteredlist=(来自文件集1中的f
从搜索词中删除
其中f.Name.包含
选择f).ToList();
返回过滤器列表;
}
}
如果需要的话,我很乐意发布更多信息。之所以看到
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
// ...
var routeValues=new RouteValueDictionary();
添加(“文件路径”,文件路径);
for(int i=0;iDataBinding.Ajax()
.选择(“MyGridAction”、“MyController”、RouteValue))
//我身上没有编译器,所以这可能是错误的重载
// ...
这意味着每个项目都有自己的键,因此模型绑定器可以很好地使用它
有关详细信息,请阅读。可能重复的我希望我了解任何“可能重复”响应是如何应用的。@user116923请确认您在视图中看到的“System.Collections.Generic.List
1[System.String]”`?选择(“MyGridAction”,“MyController”,new{filePath,searchterms})searchterms在本地输出窗口中显示正确的值。在控制器中,“public ActionResult MyGridAction(string filePath,List searchterms)”显示文本“System.Collections.Generic.List1[System.string]”作为searchterms的值我不太理解Scott Hanselman的文章,但这很有效,而且似乎很有意义。塔克斯!