学用MVC4做网站五:5.7显示文章

前面做好了浏览文章目录,现在开始做显示文章内容。

打开CommonModelController,添加一个Index(int id) action。action中先查找指定Id的内容是否存在。存在就返回视图;不存在返回错误页面。

/// <summary>
        /// 显示内容
        /// </summary>
        /// <param name="id">公共模型Id</param>
        public ActionResult Index(int id)
        {
            var _cModel = cModelRsy.Find(id);
            if (_cModel == null)
            {
                Error _e = new Error { Title = "内容不存在", Details = "未能从数据库中找到指定的内容!", Cause = "该内容已经被删除。", Solution = Server.UrlEncode("<li>返回<a href='" + Url.Action("Index", "Home") + "'>网站首页</a>。</li>") };
                return RedirectToAction("ManageError", "Prompt", _e);
            }
            return View(_cModel.Category.ContentView,_cModel);
        }

右键添加视图。

@model Ninesky.Models.CommonModel

@{
    ViewBag.Title = Model.Title + "" + Model.Category.Name;
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="banner">
    <img src="~/Content/Default/Images/banner.jpg" />
</div>
<div class="left">
    <div class="children">
        <dl>
            <dt>@Model.Category.Name</dt>
            <dd>@Html.Action("PartialChildren", "Category", new { id = Model.CategoryId })</dd>
        </dl>
    </div>
</div>
<div class="content_cnt">
    <div class="path">@Html.Action("PartialPath", "Category", new { id = Model.CategoryId })>> 详细内容</div>
    <div class="content">
        这里是文章内容
    </div>
</div>

实际上就是从views/category/index.cshtml复制过来,稍微修改一下。关键是<div class="content"> …</div>,这个里面我计划用来显示文章内容。CommonModel里面只有文章的公共信息,没有具体内容,要从ArticleController中调用。

打开ArticleController,添加PartialDetail(int id, string view = "PartialDetail")action。从名字可以看出来这里是做显示分部视图用,id是公共模型id,view是视图名称,可以根据需要传递不同的视图名,默认为"PartialDetail"。

/// <summary>
        /// 文章内容
        /// </summary>
        /// <param name="id">CommonModelId</param>
        /// <param name="view">视图</param>
        public PartialViewResult PartialDetail(int id, string view = "PartialDetail")
        {
            return PartialView(view, articleRsy.FindByCModelId(id));
        }

右键添加分部视图

@model Ninesky.Models.Article
<div class="title">@Model.CommonModel.Title</div>
<div class="Info">来源:@Model.Source 作者:@Model.Author 发布时间:@Model.CommonModel.ReleaseDate.ToLongDateString() 阅读:@Model.CommonModel.Hits </div>
<div class="text">@Html.Raw(Model.Content)</div>

视图的顶部显示标题,随后显示文章的基本信息,底部显示文章内容。文章内容一定要用@Html.Raw()用来显示HTML内容。如果直接写@Model.Content 显示出来会是HTML编码后的内容。

返回到CommonModel/index.chhtml视图将“这里是文章内容”替换为@Html.Action("PartialDetail", "Article", new { id = Model.CommonModelId })。

到这里就可以显示文章内容,但是文章内容的Url显示格式为“http://localhost:52270/CommonModel/Index/10” 这种格式看起来不是太友好。我希望url尽量短且好理解、好记。怎么办?改路由。

打开App_Start/RouteConfig.cs,在默认路由的上面加一条名称为“Item”的路由,url格式为"Items/{id}"。

routes.MapRoute(
                name: "Items",
                url: "Items/{id}",
                defaults: new { controller = "CommonModel", action = "Index", id = UrlParameter.Optional }
                );

这个url就比较顺眼了。“/CommonModel/Index/10”将会表示为“/Items/10”。

F5 浏览器中看下效果。

image

 

============================================

代码见:学用MVC4做网站五:文章

============================================

感谢您一直的关心和帮助,祝您新年快乐,合家欢乐!

posted @ 2013-02-05 16:44  洞庭夕照  阅读(5326)  评论(5编辑  收藏  举报