如何使用Asp创建CMS应用程序.Net MVC c#

本文关键字:Net MVC 应用程序 CMS 何使用 Asp 创建 | 更新日期: 2023-09-27 18:11:10

我回顾了很多已经发布在StackOverFlow上的问题,大多数的答案都是关于使用什么CMS平台,而不是如何从头开始创建一个。

搜索互联网和书籍也没有得到任何有用的答案。

我是相当新的使用Asp。. Net MVC和想知道如何做一个非常基本的CMS与Asp。. Net, MVC,实体框架,c#。

我的主要问题是创建数据库驱动的页面,这些页面不是硬编码到MVC控制器中,也不是物理位置为Somepage.cshtml

我想知道如何做以下事情:

传入URL: MainWebsite.com/DatabaseProvidedPage

目标是让URL中没有/controller/的页面的路由控制器默认为数据库驱动/创建的网页。

我想知道怎么做。

没有寻找一个平台来做这个

我想学习使用Asp创建CMS的基础知识。净MVC。

Just really want:

如何做到这一点?

URL: MainWebsite/databaseprovided网页->返回存储在数据库中的HTML给用户

谢谢,

如何使用Asp创建CMS应用程序.Net MVC c#

找到解决方案:

<标题> 路由
// Display Database Provided Page MainSite.Com/{PageName}
routes.MapRoute("DatabasePage", 
"{PageName}", 
new { controller = "Home", 
action = "Index", 
PageName = "" 
});
<标题>控制器:
public ActionResult Index(String PageName)
        {
            if (PageName == null)
                {
                    List<PageTable> pages = PagesRepository.GetAllPages();
                    return View(pages);
                }
            PageTable FindPageName = PagesRepository.GetPageByURL(PageName);

            if (FindPageName == null)
                {
                    return Content(PageName);
                }

            if (FindPageName != null)
                {
                    return View(FindPageName);
                }
            return View("");
        }
<标题> 视图
@model CMS_Repository.DAL.EF.PageTable
@{
ViewBag.Title = "Details";
}
<h2>Details</h2>
    <div>
    <h4>PageTable</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Title)
            </dt>
        <dd>
            @Html.DisplayFor(model => model.Title)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.Content)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.Content)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.FriendlyURL)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.FriendlyURL)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.ControllerName)
        </dt>

</dl>

Scaffolding会自动为您完成这些工作,而不是使用Guids。当你搭建脚手架时,你会得到一个带有几个动作的控制器,其中一个是Details。通过访问/Controller/Details/[id],查看指定项的详细信息。创建一个包含HTML列的表;就叫它HTML吧。在Details视图中,写入

@Html.Raw(Model.HTML)

我推荐微软的《MVC 5简介》。您将根据他们的初始项目创建一个网站,它应该回答您关于如何创建CMS的大多数问题。

在MVC中,使用显示/编辑模板的概念。它们允许你:

  • 有更抽象的视图。然后视图作为更具体的布局(与更通用的_Layout.cshtml一起)。
  • 将特定页面作为各种CLR类型的对象存储在持久存储库中(无论是EF还是其他)

对象应该是强类型的,并且应该分层地由代表页面内部部分的其他对象组成/聚合。

你的视图可能看起来像:

@model BikeStore.Models.BodyPartTwoSecondaryParts
<div class="container body-part">
    @Html.DisplayFor(vm => vm.BodyPart)
</div>
<div class="container">
    <div class="inline-block half-width secondary-part">
        @Html.DisplayFor(vm => vm.FirstSecondaryPart)
    </div>
    <div class="inline-block half-width secondary-part">
        @Html.DisplayFor(vm => vm.SecondSecondaryPart)
    </div>
</div>

这是可能的,因为一旦MVC看到某个CLR类型的数据出现在视图模型中,它可以自动呈现一个显示/编辑器模板。模板基本上是一个普通的Razor文件,与CLR类型具有相同的名称。

页面甚至可以定义几个可视化表示(模板)。可以通过自定义HTML helper在应用程序的各个部分(即在不同的视图中)调用它们:

例如,一个SearchResults。CSHTML视图可能只调用:

@foreach (var item in Model.SearchResults)
{
    @Html.SearchResultFor(vm => item)
}

HTML帮助方法是:

public static MvcHtmlString SearchResultFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression)
{
    string typeName = expression.ReturnType.Name;
    return htmlHelper.DisplayFor(expression, $"{typeName}Search");
}

另一个问题是如何通过实体框架存储任意深度结构的页面。(我建议选择将完整的HTML存储为nvarchar数据,因为这是CMS应该帮助您避免的。)

我不知道这样的代码会有多复杂。您可能会受到我们公司SDK中的JSON反序列化逻辑的启发。该方法构建了一个强类型模型,然后您可以将该模型传递给MVC视图并依赖于显示模板。

如果你想在上下文中看到上面的代码示例,请查看我的一篇文章。您还可以检查一个使用我们的无头CMS作为其持久存储库的工作示例应用。