2

私はコントローラーを持っています:

public class LanguageController : Controller
{
 [HttpGet]
 public ActionResult Index()
 {
   // populate viewModel from database
   return PartialView(viewModel)
 }

 [HttpPost]
 public ActionResult Index(string language)
 {
    LanguageCookie.Write(Response, language);
    return RedirectToAction(ACTION, CONTROLLER, new {culture = language});
 }
}

およびその部分的なビュー:

@model MyModel
@using (Html.BeginForm("Index", "Language"))
{
  @Html.DropDownList(
    Model.SelectedLanguageShortName, 
    Model.AllLanguages
  )
  <input type="submit" value="Select" />
}

私は_Layout.cshtmlでレンダリングします:

<div>
  @Html.Action("Index", "Language")
</div>

LanguageController が呼び出されたときに、メイン (部分的ではない) コントローラーの ACTION/CONTROLLER 名を取得する方法を教えてください。Cookie を設定したポストバックでこの情報が必要で、ユーザーを同じページにリダイレクトしたいが、優先言語を使用します。

私はこの例を見つけました:

var rd = ControllerContext.ParentActionViewContext.RouteData;
var currentAction = rd.GetRequiredString("action");
var currentController = rd.GetRequiredString("controller");

ただし、ポストバックでは ControllerContext.ParentActionViewContext は null です。ビューで必要なものを取得できますが、見苦しいです:

@Html.Hidden("Controller", HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString());
@Html.Hidden("Action", HttpContext.Current.Request.RequestContext.RouteData.Values["action"].ToString());

コントローラースコープで同じ情報を取得するには?

4

1 に答える 1

1

Index(string language)処理されると、ParentActionViewContextはnullになります。これは、サーバーへの別のリクエストであり、子アクションを呼び出した以前のリクエストについては何も知らないためです。

コントロールとアクションを非表示フィールドに保存する代わりに、アドレス全体を保存してリダイレクトを呼び出すことができます。

@model MyModel
@using (Html.BeginForm("Index", "Language", new { redirectUrl = Request.Url }))
{
    @Html.DropDownList(
        Model.SelectedLanguageShortName, 
        Model.AllLanguages
    )
    <input type="submit" value="Select" />
}

その後

[HttpPost]
public ActionResult Index(string language, string redirectTo)
{
   LanguageCookie.Write(Response, language);
   return Redirect(redirectTo);
}

もう1つの方法は、CONTROLERとACTIONをに保存TempDataすることですが、この方法では、誰かがサイトの複数のページを開いた場合に問題が発生する可能性があります。

3番目の解決策は、Ajaxでそのメソッドを呼び出し、応答が到着したらjavascriptでページをリロードすることです。

于 2013-03-03T18:14:40.467 に答える