从区域内返回视图会导致显示不同的视图

时间:2014-03-04 21:20:37

标签: asp.net asp.net-mvc asp.net-mvc-4

当我运行网站时,我希望显示Home视图,但它找不到视图。如果我改变下面的代码,并从.mvc中删除("{controller}.mvc/{action}",我会得到基本索引视图,而不是我希望从主区域获取的主视图。

从路由中删除.mvc后我注意到的内容 - 找到并执行位于Home内的Areas-Home-Controllers-HomeController控制器,当视图返回时AreaViewEngine抓住它,它没有看到区域,所以它返回基本索引视图...任何线索可能导致这个!?

我有以下RegisterRoutes

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapAreas("{controller}/{action}/{id}",
        "ProjectNamespace.Web",
        new[] { "Home" });

    routes.MapRootArea("{controller}.mvc/{action}",
        "ProjectNamespace.Web",
        new { controller = "Home", action = "Index" });
}

ViewFind位于AreaViewEngine.cs

   public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            ViewEngineResult areaResult = null;

            if (controllerContext.RouteData.Values.ContainsKey("area")) 
            {
                string areaViewName = FormatViewName(controllerContext, viewName);
                areaResult = base.FindView(controllerContext, areaViewName, masterName, useCache);
                if (areaResult != null && areaResult.View != null) 
                {
                    return areaResult;
                }
                string sharedAreaViewName = FormatSharedViewName(controllerContext, viewName);
                areaResult = base.FindView(controllerContext, sharedAreaViewName, masterName, useCache);
                if (areaResult != null && areaResult.View != null) 
                {
                    return areaResult;
                }
            }
            return base.FindView(controllerContext, viewName, masterName, useCache);
        }

位于默认控制器根目录中的BaseController

public abstract class BaseController : Controller
{
    public virtual ActionResult Index()
    {
        return View();
    }
}

以下是Home中的Areas-Home-Controllers控制器:

public class HomeController : BaseController
{
    public HomeController()
    {
    }

    public override ActionResult Index()
    {           
        HomeDetailsViewModel model = new HomeDetailsViewModel();
        model.User = "testing username"
        return View("Index", model);
    }
 }

最后,解决方案资源管理器的屏幕截图:

enter image description here

1 个答案:

答案 0 :(得分:0)

对于您必须指定的区域。试试这个

return RedirectToAction("Index", "Home", new { area = "Home" });