2

MVC ルーティングを把握するのに苦労しています。何度も読み返しましたが、まだあまり意味がありません。ルート「Teams/Summary?teamID=30」をマップして、ブラウザに「Teams/30」と表示しようとしています。これは私が現時点で持っているものですが、なぜ機能しないのか理解できません:

//Teams routes
routes.MapRoute(
        "TeamsSummary",
        "Teams/{teamID}",
        new { controller = "Teams", action = "Index", teamID = UrlParameter.Optional }
    );

「機能しない」とは、Web ページが読み込まれるが、ブラウザーのアドレス バーに「Teams?teamID=30」が表示されることを意味します。

このような単純なマッピングを実行するために何をする必要があるかを誰かが理解するのを手伝ってくれませんか? ちなみに、干渉すると思われる他のルートは設定しておらず、Global.asax.cs ファイルの既定のルートの前にリストされています。

このテーマに関する優れた記事やチュートリアルがあれば、それも役に立ちます。ありがとう。

編集: URLを手動で入力すると、ルートは正常に機能します。フォームを使用してコントローラーにポストバックすると、問題が発生するようになりました。

コントローラ:

public ActionResult Index(TeamsViewModel model)
    {
        if (model.teamID != null)
            model.TeamSummary = new TeamSummaryViewModel(model.teamID);

        return View(model);
    }

意見:

@{
ViewBag.Title = "Teams";
}

@using (Html.BeginForm("Index","Teams",FormMethod.Get))
{
    @Html.DropDownList("teamID", new SelectList(Model.Teams,"teamID","Name"))    
    <input type="submit" value="Filter"/>
}
@if (Model.TeamSummary != null)
{
    Html.RenderPartial("_TeamSummary", Model.TeamSummary);
}

Edit2: 元のアクションを、以前のように概要ではなく、TeamsController のインデックスに変更しました。

4

5 に答える 5

1

ルーティングは完全に機能します。

Global.asax

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "TeamsSummary",
                "Teams/{teamID}",
                new { controller = "Teams", action = "Summary" }
            );

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

HTMLビューで作成されたリンク:

<%= Html.ActionLink("Summary", "Summary", "Teams", new {teamID = 11 },null)%>
于 2012-11-24T13:04:24.447 に答える
1

一見すると、ルートに明らかな問題があるようには見えません。

TeamID?のデフォルトを指定する必要があるかもしれません。TeamIDルートをより適切に定義し、他のルートを許可するために、パラメータに制限を追加しても害はありませんTeams

例えば

context.MapRoute(
        "TeamsSummary",
        "Teams/{teamID}",
        new { controller = "Teams", action = "Summary", teamID = "" },
        new { teamID = @"\d+" }
    );

アップデート

あなたのコード

Html.BeginForm("Index","Teams",FormMethod.Get)

POST ではなく GET としてブラウザに情報を返すフォームを作成します。これは基本的に、すべての入力値がクエリ文字列値としてアタッチされることを意味します...これはクライアント側で行われ、ASP.NET MVC ルーティングとは関係ありません。

慣れていない場合は、フォーム アクションに関する W3 Schools の記事をチェックしてみてください - http://www.w3schools.com/tags/att_form_action.asp

于 2012-11-23T21:29:54.513 に答える
1

何が起こるかというと、一致する TeamsSummary ルートの前に別のルートが定義されているということです。ルートの順序を変更するか、制約を追加して、目的のルートと確実に一致させる必要があります。詳細については、この投稿を読むことをお勧めします。

于 2012-11-24T02:44:32.113 に答える
1

適切なルート名を確認してください。ActionLink の作成中に Global.asax ファイルで指定された名前と一致する必要があります。

于 2012-12-11T05:54:39.463 に答える
0

こちらのフェローが提案しているように、必要に応じて従来のルーティングを取り除くことができます

ほとんどの場合、そのガイドに従うと、これが思いついた場所になります。

[Route("Teams/{teamID}")]    

public ActionResult Index(TeamsViewModel モデル) { if (model.teamID != null) model.TeamSummary = new TeamSummaryViewModel(model.teamID);

    return View(model);
}
于 2015-10-28T07:31:03.530 に答える