1

ASP.NET MVC 4 では、動作、つまりリンクがどのように生成されるのか疑問に思います。

3 つのアクションを持つ単純なコントローラーを想像してください。それぞれが整数パラメーター「requestId」を受け取ります。次に例を示します。

public class HomeController : Controller
{
    public ActionResult Index(int requestId)
    {
        return View();
    }

    public ActionResult About(int requestId)
    {
        return View();
    }

    public ActionResult Contact(int requestId)
    {
        return View();
    }
}

およびこの登録済みルート (デフォルト ルートの前):

routes.MapRoute(
    name: "Testroute",
    url: "home/{action}/{requestId}",
    defaults: new { controller = "Home", action = "Index" }
);

を使用してインデックスビューを呼び出しますhttp://localhost:123/home/index/8

このビューでは、他の 2 つのアクションのリンクをレンダリングします。

@Html.ActionLink("LinkText1", "About")
@Html.ActionLink("LinkText2", "Contact")

ここで、MVC は、次のように、「requestId」の現在のルート値を含むこのリンクをレンダリングすることを期待しています。

http://localhost:123/home/about/8
http://localhost:123/home/contact/8

しかし、私はこれらのリンクを取得します(パラメータなし):

http://localhost:123/home/about
http://localhost:123/home/contact

...しかし、インデックスアクションを指定する場合はそうではありません:

@Html.ActionLink("LinkText3", "Index")

私が避けたいのは、この方法でパラメータを明示的に指定することです:

@Html.ActionLink("LinkText1", "Contact", new { requestId = ViewContext.RouteData.Values["requestId"] })

action パラメータの前に requestId パラメータを移動すると、期待どおりに動作しますが、移動したくありません。

routes.MapRoute(
    name: "Testroute",
    url: "home/{requestId}/{action}",
    defaults: new { controller = "Home", action = "Index" }
);

誰かが私にこの振る舞いを説明できますか? パラメータを明示的に指定せずにこれを機能させるにはどうすればよいですか?

4

1 に答える 1

0

InController: int を nullable int に置き換えます

ルーティングの場合: ルーティングで requestId をオプションとして設定します

routes.MapRoute(
    name: "Testroute",
    url: "home/{action}/{requestId}",
    defaults: new { controller = "Home", action = "Index" ,requestId=RouteParameter.Optional }
);
于 2013-11-13T10:17:54.217 に答える