2011-06-20 60 views
3

注意:這裏的所有代碼都被解釋爲一個示例,因爲我無法顯示實際碼。從類型'System.String'到類型'T'的參數轉換失敗,因爲沒有類型轉換器可以在這些類型之間進行轉換

我有一個看起來視圖模型類類似

public SearchViewModel 
{ 
    public string Term 
    { 
    get; set; 
    } 

    public SearchResult Result 
    { 
    get; set; 
    } 

    public List<Filter> Filters 
    { 
    get; set; 
    } 
} 

這勢必會定期控制器,一切工作正常:

public ActionResult Search (SearchViewModel model) 
{ 
     if (ModelState.IsValid) 
     { 
      model.Result = _searchService.Search(model.Term); 
      return View(model); 
     } 
} 

我也有一個處理一個採取其他行動從包含複選框的表單發佈POST。此控制器處理創建Filter類並重定向到搜索操作。

喜歡的東西:

public ActionResult Filter(FormCollection formParams) 
    { 
     return RedirectToAction("Search", new SearchViewModel 
     { 
      Term = formParams["Term"], 
      Filters = 
       formParams.Keys 
        .Cast<String>() 
        .Where(k => k.Contains("filter")) 
        .Select(k => Filter.Build(k, formParams[k])) 
        .ToList()       
     });           
    } 

這傳遞一個視圖模型涉及到List集合填充回搜尋行動。

然而,在搜索行動,ModelState.IsValid現在返回false。這是因爲模型綁定拋出此異常:

從類型 「System.String」的參數轉換爲鍵入「過濾器」 失敗,因爲沒有類型轉換器可以 這些類型之間的轉換。

綜觀ModelState中的原始值「過濾器」顯示爲字符串:

System.Collections.Generic.List`1[Filter] 

這似乎是表的實際內容的行動之間的過渡過程中丟失,可能是因爲它只在屬性成員上調用ToString()。

在這一點上,我有一個模糊的想法,爲什麼這是失敗的,我想我可以寫一個自定義模型綁定器或類型轉換器,使其工作,但是,我有一種感覺,這種方法聞起來,這可能是微不足道的,我只是接近它而已。

那麼,什麼是正確的ASP.NET MVC 3,從一個動作到另一個傳遞複雜類型的集合?

+0

試試這個(我有同樣的問題,但我不記得這是否是解決方案): return RedirectToAction(「Search」,new RouteValueDictionary( new SearchViewModel {...}) ; – lontivero

回答

0

甲RedirectToAction是一個簡單的HTTP 302重定向。你確定你需要瀏覽器重新請求一個新的頁面嗎?

比如你想避免triggerring一個「重新提交後的數據」對話框重新加載頁面? (見POST-REDIRECT-GET模式)

爲什麼不直接使用:

public ActionResult Filter(FormCollection formParams) 
{ 
    return Search(new SearchViewModel{ 
    Term = formParams["Term"], 
    Filters = 
     formParams.Keys 
       .Cast<String>() 
       .Where(k => k.Contains("filter")) 
       .Select(k => Filter.Build(k, formParams[k])) 
       .ToList()       
    });           
} 

另外,您可以使用TempData的,如果合適的存儲請求,或可能客戶端的cookie之間的狀態。

如果你想在搜索結果頁面是在用戶的瀏覽器可收藏你需要使用REST或某種形式的serilaised字符串(例如,以表示URL搜索參數的狀態。JSON)

0

導致此錯誤的常見原因之一是使用某種reserve words,如「動作,評論,過濾器等」。。因此,更改Action名稱「過濾器」與另一個名稱,即「ApplyFilter」可能會解決該問題。希望這有助於...

相關問題