2014-05-07 56 views
1

我繼承了一個按搜索項過濾的網格。構建它的人員將搜索條件添加到模型中,以使其更容易在整個流程中傳遞。當搜索條件是一個簡單的字符串時,一切似乎都可以正常工作,但將其重構爲列表<>以解決多個搜索條件。在查看頁面上顯示「searchterms」,但當它到達控制器時,它不再是正確的值,它顯示爲「System.Collections.Generic.List`1 [System.String]」,而不是價值觀念,這些價值觀念會影響整個過程的其餘部分。從那裏我嘗試使用我從SO獲得的Linq搜索條件來篩選列表。請告知您是否可以提前致謝。在視圖和控制器之間傳遞List <>作爲參數

的觀點:

<%    
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

可能的重複http://stackoverflow.com/questions/717690/asp-net-mvc-pass-array-object-as-a-route-value-within-html-actionlink –

+1

我希望我明白如何的「可能重複」答覆。 – Darkloki

+0

@ user116923你能確認你在哪裏看到'「System.Collections.Generic.List'1 [System.String]」'? –

回答

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

+0

我對Scott Hanselman的帖子沒有太多的理解,但這工作,這似乎是有道理的。感謝名單! – Darkloki

相關問題