2013-03-03 63 views
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> 

请让我知道如何从我的LanguageControlle获得主(非部分)控制器的ACTION/CONTROLLER名称r被称为。我需要在回送的地方设置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()); 

如何获得在控制器范围相同的信息?

回答

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和行动TempData,但通过这种方式,如果有人打开了您网站的多个网页,就会产生问题。

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

+0

谢谢Slawomir,我选择了第一个变体,因为使用url我记得不仅是控制器/动作,还有其他参数在初始请求中。 – 2013-03-03 20:51:47