ASP.NET MVC,在Unroutable页面嵌套中卷入

时间:2011-01-06 14:15:18

标签: asp.net-mvc routing

路由的概念并不新鲜,它适用于{area}/{controller}/{action}/{parameter}的概念,但很少有站点是独立的UI交互。

网站通常需要自己的部分内容,这些内容并非专门用于获取数据,而是呈现数据。例如,我正在处理的其中一个站点本身就有很大一部分用于用户交互(MVC系统专门解决这个问题。一个Membership区域,一个管理信息的地方,一个购买物品的方式等等。 ) - 但它还需要一个功能更像旧式网站的部分,你只需要查看文件夹结构等页面。

我发现的一个解决方案是尝试自定义视图引擎。这很有效,但我很快发现自己迷失在一个错综复杂的路由方案中。另一个我想我可以使用的是只有一个IgnoreRoute并将文件放在被忽略的文件夹中,就像普通的html / aspx一样,但我真的更愿意使用控制器以便我有机会将来会从数据库等返回数据。

那么让我告诉你我当前的情景......

    • 成员
    • 规则
    • 控制器
      • 的HomeController
      • FileView(字符串文件夹,字符串文件)
      • 主页
      • 一般
        • 自定义
          • 内容
          • yyy.cshtml
        • xxx.cshtml
          • @ Html.Partial( “内容/ yyy.cshtml”)
        • xxx.cshtml
        • xxx.cshtml

等。 Rules区域基本上设置为像普通/folder/file/结构一样运行。所以这是我的控制器..

public class HomeController : Controller
{
    //
    // GET: /Information/Home/
    public ActionResult Index()
    {
        return View();
    }

    // **************************************
    // URL: /Rules/{controller}/{folder}/{file}
    // **************************************
    public ViewResult FileView(string folder, string filename)
    {
        return View(String.Format("{0}/{1}", folder, filename));
    }
}

现在,如果我有一个类别,我只需要一个从该区域的HomeController继承的轻量级控制器,就像这样......

public class GeneralController : Rules.Controllers.HomeController
{
    // **************************************
    // URL: /Rules/General/Customize/{id}
    // **************************************

    public ViewResult Customize(string id)
    {
        return FileView("Customize", id);
    }
}

那么,对于'sub'控制器中的每个文件夹,我有一个Route,它接收文件的名称。

这有效,但我觉得它过于笨重。谁能提出更好的选择?页面太多,嵌套太多,每个页面都有一个完整的ActionResult。我也想保持干净的网址。

1 个答案:

答案 0 :(得分:2)

也许您可以为Membership区域使用catch-all路由,将其路由到控制器(MembershipController?)并让该控制器只呈现路由捕获的视图,如下所示:

public class MembershipController : Controller
{
    public ActionResult Index(string pageTitle)
    {
        return View(pageTitle);
    }
}

路线:

        routes.MapRoute(
            "Membership",
            "Membership/{*pageTitle}",
            new  {controller = "Membership", action = "Index", pageTitle = "NotFound"});

当然,在控制器中你应该检查视图是否存在,但是这个应该让你感动。虽然我不明白为什么你想在显示(静态?)内容时想要在其前面使用MVC。