我有这个
public class HomeController{
public ActionResult Index()
{
//do stuff
return View();
}
显然,这会在Home文件夹中选择并呈现Index.aspx。
我们真正想要的是选择另一个文件 - Index.ar.aspx - 如果CurrentCulture是ar-AE。我不想在每次返回View()调用时都使用IF语句。有人帮我找到覆盖所选视图文件名称的最佳位置吗?
注意,请不要告诉我:)我知道单独的文件有点hacky,我们正在使用RESX文件,DIR指令和路由来更改语言等。但我们需要单独的文件进行布局原因。
答案 0 :(得分:4)
您应该创建自己的ViewEngine。如果您正在使用与MVC默认的WebFormViewEngine,您可以轻松地将其子类化,然后覆盖FindView(...)方法。
在重写的FindView(...)方法中,您可以根据包含当前文化名称的约定轻松查找文件。
如果使用移动设备浏览网站,请查看有关ViewEngine的Scott Hanselmans帖子,该文章会查找不同的视图文件。
也许是这样的:
public class ExampleViewEngine : WebFormViewEngine
{
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
ViewEngineResult result = null;
string conventionViewName = string.Format("{0}.{1}", viewName, System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName);
result = base.FindView(controllerContext, conventionViewName, masterName, useCache);
if (result == null || result.View == null)
{
result = base.FindView(controllerContext, viewName, masterName, useCache);
}
return result;
}
}
答案 1 :(得分:2)
听起来你真的希望View引擎能够决定返回哪个视图,而不是让控制器负责它。
查看this tutorial,然后浏览一下其他人。覆盖默认视图引擎非常简单,您可以在那里添加选择逻辑的语言,在控制器级别上不需要它。
答案 2 :(得分:0)
public class BaseController{
// Don't remember parameter type exactly
public void OnActionExecuted(ActionExecutedContext context)
{
// if view is returned, add culture suffix to its name
// also may need to do so for PartialViewResult
// One problem is if view is not named; Name is "";
// in this case use context.ActionContext.Name or RouteData["action"] for view name
if (context.Result is ViewResult)
{
var view = context.Result as ViewResult;
view.Name = view.Name + CurrentCultureSuffix;
}
}
}
public class HomeController: BaseController{
public ActionResult Index()
{
//do stuff
return View();
}
}