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 在回发中为空。我能够在视图中得到我需要的东西,但它很难看:

@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 为空,因为这是对服务器的另一个请求,它对调用子操作的先前请求一无所知。

您可以存储整个地址并调用重定向,而不是将控制和操作存储在隐藏字段中:

@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);
}

另一种方法是将 CONTROLER 和 ACTION 保存在 中TempData,但是如果有人打开您网站的多个页面,您可能会遇到问题。

第三种解决方案是使用 Ajax 调用该方法,并在响应到达时使用 javascript 重新加载页面。

于 2013-03-03T18:14:40.467 回答