5

私はこのような行動をとっています:

public class News : System.Web.Mvc.Controller
{
    public ActionResult Archive(int year)
    {
       / *** /
    }
}

このようなルートで:

routes.MapRoute(
           "News-Archive",                                              
           "News.mvc/Archive/{year}",                           
           new { controller = "News", action = "Archive" }
       );

私がいるURLは次のとおりです。

News.mvc/Archive/2008

このページには次のようなフォームがあります。

<form>
    <select name="year">
        <option value="2007">2007</option>
    </select>
</form>

フォームで「2007」が選択されている場合、フォームの送信はNews.mvc/Archive/2007に移動する必要があります。

これには、フォームの「action」属性が「News.mvc/Archive」である必要があります。

ただし、次のようなフォームを宣言すると、次のようになります。

<form method="get" action="<%=Url.RouteUrl("News-Archive")%>">

次のようにレンダリングされます。

<form method="get" action="/News.mvc/Archive/2008">

誰かが私に欠けているものを教えてもらえますか?

4

3 に答える 3

2

いくつか問題があると思います。

まず、ルートには「year」のデフォルト値がないため、URL「/News.mvc/Archive」は実際にはルーティングの目的では無効です。

次に、フォーム値がルートパラメータとして表示されることを期待していますが、それはHTMLの動作方法ではありません。選択と送信を含むプレーンフォームを使用する場合、URLの末尾に「?year=2007」が付けられます。これは、GETメソッドフォームがHTMLで機能するように設計されている方法です。

したがって、何が重要かについて結論を出す必要があります。

  • ユーザーがドロップダウンから何かを選択できるようにし、送信URLを変更できるようにする場合は、Javascriptを使用してこれを実現する必要があります(フォームの送信をインターセプトして正しいURLを作成することにより)。
  • URLとして/News.mvc/Archive?year=2007で問題がない場合は、ルートから{year}指定子を完全に削除する必要があります。フォームの値もアクションメソッドのパラメーターに入力されるため、アクションに「intyear」パラメーターを残すことができます。
于 2008-09-08T05:25:58.417 に答える
0

理由はわかったと思います。ルートには{year}が含まれているため、生成されたルートも常に含まれます。

誰かがこれを確認できれば?

于 2008-09-08T05:38:03.053 に答える
0

解決

さて、ここに解決策があります(私をそこに導いてくれたBradに感謝します)。

1)ルートにデフォルト値を要求する:

routes.MapRoute(
       "News-Archive",                                              
       "News.mvc/Archive/{year}",                           
       new { controller = "News", action = "Archive", year = 0 }
   );

2)URLセグメントであるかのようにGETパラメータを解析するためのリダイレクトを追加します。

public ActionResult Archive(int year)
{
   if (!String.IsNullOrEmpty(Request["year"]))
   {
       return RedirectToAction("Archive", new { year = Request["year"] });
   }
}

3) 「デフォルト」の年エントリをリダイレクトするコードの前に、リクエストパラメータのリダイレクトコードがあることを確認してください。すなわち

public ActionResult Archive(int year)
{
   if (!String.IsNullOrEmpty(Request["year"]))
   {
       return RedirectToAction("Archive", new { year = Request["year"] });
   }
   if (year == 0)
   {
       /* ... */
   }
   /* ... */
}

3)Url.RouteUrl()呼び出しで、年のデフォルト値を明示的に指定します。

Url.RouteUrl("News-Archive", new { year = 0 })
于 2008-09-08T06:09:23.367 に答える