代码之家  ›  专栏  ›  技术社区  ›  tobinharris

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

  •  0
  • tobinharris  · 技术社区  · 16 年前

    我有这个

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

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

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

    3 回复  |  直到 16 年前
        1
  •  4
  •   aanund    16 年前

    您应该创建自己的ViewEngine。如果您使用的WebFormViewEngine是MVC的默认引擎,那么您可以轻松地将其子类化,然后重写FindView(…)方法。

    在重写的FindView(…)方法中,可以根据包含当前区域性名称的约定轻松查找文件。

    Scott Hanselmans 发布关于ViewEngine的帖子,如果使用移动设备浏览站点,它将查找不同的视图文件。

    也许是这样的:

    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;
        }
    }
    
        2
  •  2
  •   womp    16 年前

    this tutorial ,谷歌搜索其他一些。覆盖默认视图引擎非常简单,您可以在其中添加语言选择逻辑,从而消除在控制器级别对它的需求。

        3
  •  0
  •   queen3    16 年前
    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();
        }
    }