我有一个控制器:
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());
如何在控制器范围内获取相同的信息?
答案 0 :(得分:1)
处理Index(string language)
时,ParentActionViewContext为null,因为这是对服务器的另一个请求,并且它不知道有关调用子操作的先前请求的任何信息。
您可以存储整个地址并调用Redirect:
,而不是将控件和操作存储在隐藏字段中@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);
}
另一种方法是在TempData
中保存CONTROLER和ACTION,但是如果有人打开您网站的多个页面,就会出现问题。
第三个解决方案是使用Ajax调用该方法,并在响应到达时使用javascript重新加载页面。