[英]Html.RenderAction not hitting default route as expected
我有一個這樣指定的默認路由:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "", RouteName = "Default" }, // Parameter defaults
new { controller = @"[^\.]*" } // Constraints (Ignore urls with periods in them)
);
我有一個名為 Test 的控制器和一個名為 DoSomething 的 Test 操作,其定義如下:
public ActionResult DoSomething(int someId, int someotherId, IEnumerable<string> listOfSomething, bool flag, bool flag2)
我正在嘗試調用這樣的操作:
var parameters = new RouteValueDictionary();
parameters.Add("someId", id);
parameters.Add("someotherId", otherId);
parameters.Add("flag", flag1);
parameters.Add("flag2", flag2);
for (int i = 0; i < thisList.Count; i++)
{
parameters.Add("listOfSomething[" + i + "]", thisList[i]);
}
Html.RenderAction("DoSomething", "Test", parameters);
Html.RenderAction 調用因 InvalidOperationException 失敗:路由表中沒有與提供的值匹配的路由。
什么會導致這種情況? 默認路由應該接這個電話嗎?
路由表中沒有路由與提供的值匹配表示RouteCollection
中沒有有效路由與請求的 URL 匹配,即您的默認路由參數計數與DoSomething
操作參數不匹配(1 個參數:5 個參數)。
另請注意, IEnumerable<string>
被視為復雜對象,因此您不能將其作為 URL 中RouteValueDictionary
參數的一部分傳遞。 因此,您應該只傳遞 4 個值參數並將IEnumerable<string>
對象作為Session
或TempData
內容TempData
。
首先,在默認路由之上定義一個帶有 4 個參數的自定義路由(避免修改路由順序中最后放置的默認路由,其他路由可能需要):
routes.MapRoute(
"Custom", // Route name
"{controller}/{action}/{someId}/{someotherId}/{flag}/{flag2}", // URL with parameters
new { controller = "Home", action = "Index", someId = "", someotherId = "", flag = "", flag2 = "" }, // Parameter defaults
new { controller = @"[^\.]*" } // Constraints (Ignore urls with periods in them)
);
然后,編輯控制器操作方法以接收 4 個參數(根據上面的解釋,從參數列表中去除IEnumerable<string>
):
public class TestController : Controller
{
public ActionResult DoSomething(int someId, int someotherId, bool flag, bool flag2)
{
// other stuff
}
}
然后傳遞參數用於重定向, IEnumerable
對象存儲在TempData
或Session
變量中:
var parameters = new RouteValueDictionary();
parameters.Add("someId", id);
parameters.Add("someotherId", otherId);
parameters.Add("flag", flag1);
parameters.Add("flag2", flag2);
var list = new List<string>();
for (int i = 0; i < thisList.Count; i++)
{
list.Add(thisList[i]);
}
TempData["listOfSomething"] = list;
Html.RenderAction("DoSomething", "Test", parameters);
或者直接在RedirectToAction
定義參數:
var list = new List<string>();
for (int i = 0; i < thisList.Count; i++)
{
list.Add(thisList[i]);
}
TempData["listOfSomething"] = list;
Html.RenderAction("DoSomething", "Test", new { someId = id, someotherId = otherId, flag = flag1, flag2 = flag2 });
如果thisList
已經是IEnumerable<string>
,則刪除for
循環並將其直接分配給Session
/ TempData
:
TempData["listOfSomething"] = thislist;
可以使用這種方式檢索參數列表:
var listOfParameters = TempData["listOfSomething"] as List<string>;
類似問題作為參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.