3

/Product/Category/IdId 値は、選択されたドロップダウン リスト ID です。しかし、代わりに/Product/Category?Id=Id、うまく機能しますが、URL が見栄えがよくありません。

@using (Html.BeginForm("Category", "Product", FormMethod.Get))
{
<div class="category-search">
    <label for="CategoryList">Filter by Category</label>
    @Html.DropDownList("Id", (IEnumerable<SelectListItem>)ViewBag.CategoryList)
    <input type="submit" value="Filter" />
</div>   
}

きれいな URL を維持するために何をする必要がありますか

編集
My Global.asax.cs には、次のルートのみがマップされています

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

私のコントローラーでは、ViewBag に追加しています(ViewModel を使用することをお勧めしますが、それは既に IPagedList で使用されています)。

var categories = Session.QueryOver<Category>()
                        .OrderBy(c=>c.CategoryName).Asc
                        .List();
ViewBag.CategoryList = new SelectList(categories, "CategoryName", "CategoryName");

CategoryNameドロップダウンの ID とラベルにを使用するのは少しおかしいと思いますが、ID に GUID を使用しているため、ひどい URL になります。これは、URL を「ハッキング」できることが有効な唯一のケースです。つまり、ユーザーが希望する場合は、ドロップダウン リストで検索するのではなく、必要に応じて URL でフィルタリングするカテゴリを入力できることを嬉しく思います。

4

2 に答える 2

1

Javascriptでフォーム送信をキャプチャし、デフォルトアクションを抑制し、情報を抽出し、新しいアクション文字列を構築し、その新しいアクション文字列にフォームを送信することなく、やりたいことができるとは思えません。

問題は、ルート パーツではなく、フォームの値を送信していることです。フォームの ID は、ルート パーツの ID とはまったく異なります。を使用すると、フォーム変数は常に GET またはクエリ文字列としてサーバーに送られますFormMethod.Get

サーバー側の MVC コードではなく、フォームの値が送信される方法を制御するのはブラウザーであることに注意することが重要です。

于 2013-03-28T15:23:38.593 に答える
1

デフォルトルートにフックしようとしていると思います。つまり、それに一致させるにiは小文字が必要です。Idに変更するとid、動作するはずです。

デフォルトのルートは次のとおりです。

RouteTable.Routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
于 2013-03-28T15:09:23.293 に答える