选择在ASP.NET MVC中呈现不同的View(ASPX)文件

时间:2009-12-09 19:30:43

标签: asp.net-mvc view

我有这个

public class HomeController{

    public ActionResult Index()
    {
       //do stuff
       return View();
    }

显然,这会在Home文件夹中选择并呈现Index.aspx。

我们真正想要的是选择另一个文件 - Index.ar.aspx - 如果CurrentCulture是ar-AE。我不想在每次返回View()调用时都使用IF语句。有人帮我找到覆盖所选视图文件名称的最佳位置吗?

注意,请不要告诉我:)我知道单独的文件有点hacky,我们正在使用RESX文件,DIR指令和路由来更改语言等。但我们需要单独的文件进行布局原因。

3 个答案:

答案 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();
    }
}