C# 创建动态ActionResult

C# 创建动态ActionResult,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我在考虑为我自己的网站创建一个CMS,我认为创建页面和动态更新元标记和内容将是eaiser的职责。当我仔细考虑的时候,我意识到我可以更新内容,比如说 public ActionResult Index() { ViewBag = "My Content"; return View(); } 但我从未想过要创建新页面,在数据库中引用它们,并使用正确的控制器 有没有办法在MVC中动态创建控制器/动作结果和相应的视图 问候 James您可以采用许多CMS系统使用的方法,即在数据库中为每个页

我在考虑为我自己的网站创建一个CMS,我认为创建页面和动态更新元标记和内容将是eaiser的职责。当我仔细考虑的时候,我意识到我可以更新内容,比如说

public ActionResult Index()
{
  ViewBag = "My Content";
  return View(); 
}
但我从未想过要创建新页面,在数据库中引用它们,并使用正确的控制器

有没有办法在MVC中动态创建控制器/动作结果和相应的视图

问候


James

您可以采用许多CMS系统使用的方法,即在数据库中为每个页面分配一个ID以及页面内容,然后使用一个单独的控制器来查找和显示页面

即:

然后在页面中显示内容。如果内容包含HTML标记,请使用:

@Html.Raw(ViewBag.Content)

如果您确实需要页面的不同视图,通过相同的操作,您可以执行以下操作:

public ActionResult Index(string pageID)
{
    //Query the database for content for page with ID of pageID
    ViewBag.Content = //Result from DB;
    return View("/path/to/other/view"); 
}
public ActionResult Page(string url)
{
    return Content("content for url");
}
但是,这被认为是一种不好的做法,请自行决定使用。
如果您想要友好的URL,我会这样做:

public ActionResult Index(string pageID)
{
    //Query the database for content for page with ID of pageID
    ViewBag.Content = //Result from DB;
    return View("/path/to/other/view"); 
}
public ActionResult Page(string url)
{
    return Content("content for url");
}
然后你会有一条路线,看起来像:

routes.MapRouteLowercase(
    "Page",
    "{*url}",
    new {controller = "CmsPage", action = "Page", url = UrlParameter.Optional});

好。。是的,但这比仅仅拥有一个好的路由/url方案和一个控制器加载所需的内容要复杂得多。