注意:這裏的所有代碼都被解釋爲一個示例,因爲我無法顯示實際碼。從類型'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,從一個動作到另一個傳遞複雜類型的集合?
試試這個(我有同樣的問題,但我不記得這是否是解決方案): return RedirectToAction(「Search」,new RouteValueDictionary( new SearchViewModel {...}) ; – lontivero