簡體   English   中英

Html.RenderAction 未按預期達到默認路由

[英]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>對象作為SessionTempData內容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對象存儲在TempDataSession變量中:

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

類似問題作為參考:

如何在 Redirecttoaction 中傳遞 List

在 MVC4 中使用 RedirectToAction 發送列表

重定向時將數組或字符串列表從一個操作傳遞到另一個操作

使用 ASP.NET MVC 的多參數路由

如何在 Asp.NET MVC 中使用 RedirectToAction() 傳遞多個對象?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM