0

マスターページにアクションリンクがあり_Layoutます。これを押すと、メニューのレイアウトが変わります。しかし、ページの現在のコンテンツを変更したくありません。

JavaScriptを使用せずにMVC3カミソリでこれを達成するにはどうすればよいですか?

私はそれが次のようなものになると推測しています:

  • ボタンがクリックされるとポストバックが発生します
  • 変更されたメニュー状態が持続するように値を設定します
  • 前のビューに戻る

特に「前のビューに戻る」部分は私を困惑させます。誰かがこれを達成する方法を説明できますか?

4

2 に答える 2

2

コントローラーで OnActionExecuting をオーバーライドします。

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.RequestContext.HttpContext.Request.QueryString["MenuLayoutName"] != null && IsValidMenuLayoutName(filterContext.RequestContext.HttpContext.Request.QueryString["MenuLayoutName"] != null))
            ViewBag.MenuLayoutName = filterContext.RequestContext.HttpContext.Request.QueryString["MenuLayoutName"];
    }

メニューをレンダリングするときに _Layout.cshtml で、ViewBag.MenuLayoutName を見て、使用するメニューを決定します。最も効率的な方法は、単純に部分ビューを作成して、次のようにメニューをレンダリングできるようにすることです。

@{ Html.RenderPartial(ViewBag.MenuLayoutName); }

ただし、IsValidMenuLayoutName の呼び出しに注意してください。そうしないと、有効な部分ビューの名前をそこに入力して、メニューが表示されると予想される場所にレンダリングされる可能性があります。

ユーザーがさまざまなメニュー レイアウトを選択できるようにするリンクで、ページへのリンクを変更して、使用するレイアウトの名前を指定します。

<a href="/Index?MenuLayoutName=RedLayout">Use Red Menu</a>
于 2012-11-21T21:05:48.200 に答える
1

非常に原始的なアプローチを使用して、基本的にそれ自体にリンクするボタンを作成できます。

<a href="@(Request.RawUrl)?menu=foo">Foo Menu</a>
<a href="@(Request.RawUrl)?menu=bar">Bar Menu</a>

(またはロジックを使用して、表示されているものに基づいて表示します)次に、_Layout.cshtml提供されているものをレンダリングするように変更します。

@{
  String menu = (String)Request.Params["menu"] ?? "foo";
  if (menu == "foo"){
    /* Foo menu render */
  } else {
    /* bar menu render */
  }
}

その後は、同じ URL への単なる往復です。繰り返しになりますが、POST された情報を介してページにアクセスした場合、それは失われます。menuまた、リクエストに既に存在するかどうかをテストするロジックを追加しませんでしたが、追加する必要があります。

于 2012-11-21T21:05:27.520 に答える