ASP.NET MVC開発:CMS開発-バックグラウンド管理とメッセージ発表

18431 ワード

CMSはContent Management Systemの略で「コンテンツ管理システム」を意味する.前に基本インタフェースと基本機能ページを開発しましたが、ここをクリックして文章を見てください.
このセクションでは、すべての機能を完了します.ユーザー管理コントローラ:Users Admin、ロール管理コントローラ:Roles Adminを完了します.最後にユーザコメントを完了すると,ユーザコメントはDetailsページに表示され,ログインユーザにテキストボックスを表示することでコメントを入力することができ,難易度はやや向上した.
新規コントローラ:UsersAdmin

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using AxCMS.Models;

namespace AxCMS.Controllers
{
    [Authorize(Roles = "Admin")]
    public class UsersAdminController : Controller
    {
        public UsersAdminController()
        {
        }

        public UsersAdminController(ApplicationUserManager userManager, ApplicationRoleManager roleManager)
        {
            UserManager = userManager;
            RoleManager = roleManager;
        }

        private ApplicationUserManager _userManager;
        public ApplicationUserManager UserManager
        {
            get
            {
                return _userManager ?? HttpContext.GetOwinContext().GetUserManager();
            }
            private set
            {
                _userManager = value;
            }
        }

        private ApplicationRoleManager _roleManager;
        public ApplicationRoleManager RoleManager
        {
            get
            {
                return _roleManager ?? HttpContext.GetOwinContext().Get();
            }
            private set
            {
                _roleManager = value;
            }
        }

        //
        // GET: /Users/
        public async Task Index()
        {
            return View(await UserManager.Users.ToListAsync());
        }

        //
        // GET: /Users/Details/5
        public async Task Details(string id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var user = await UserManager.FindByIdAsync(id);

            ViewBag.RoleNames = await UserManager.GetRolesAsync(user.Id);

            return View(user);
        }

        //
        // GET: /Users/Create
        public async Task Create()
        {
            //Get the list of Roles
            ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync(), "Name", "Name");
            return View();
        }

        //
        // POST: /Users/Create
        [HttpPost]
        public async Task Create(RegisterViewModel userViewModel, params string[] selectedRoles)
        {
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser { UserName = userViewModel.Email, Email = userViewModel.Email };
                var adminresult = await UserManager.CreateAsync(user, userViewModel.Password);

                //Add User to the selected Roles 
                if (adminresult.Succeeded)
                {
                    if (selectedRoles != null)
                    {
                        var result = await UserManager.AddToRolesAsync(user.Id, selectedRoles);
                        if (!result.Succeeded)
                        {
                            ModelState.AddModelError("", result.Errors.First());
                            ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync(), "Name", "Name");
                            return View();
                        }
                    }
                }
                else
                {
                    ModelState.AddModelError("", adminresult.Errors.First());
                    ViewBag.RoleId = new SelectList(RoleManager.Roles, "Name", "Name");
                    return View();

                }
                return RedirectToAction("Index");
            }
            ViewBag.RoleId = new SelectList(RoleManager.Roles, "Name", "Name");
            return View();
        }

        //
        // GET: /Users/Edit/1
        public async Task Edit(string id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var user = await UserManager.FindByIdAsync(id);
            if (user == null)
            {
                return HttpNotFound();
            }

            var userRoles = await UserManager.GetRolesAsync(user.Id);

            return View(new EditUserViewModel()
            {
                Id = user.Id,
                Email = user.Email,
                RolesList = RoleManager.Roles.ToList().Select(x => new SelectListItem()
                {
                    Selected = userRoles.Contains(x.Name),
                    Text = x.Name,
                    Value = x.Name
                })
            });
        }

        //
        // POST: /Users/Edit/5
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task Edit([Bind(Include = "Email,Id")] EditUserViewModel editUser, params string[] selectedRole)
        {
            if (ModelState.IsValid)
            {
                var user = await UserManager.FindByIdAsync(editUser.Id);
                if (user == null)
                {
                    return HttpNotFound();
                }

                user.UserName = editUser.Email;
                user.Email = editUser.Email;

                var userRoles = await UserManager.GetRolesAsync(user.Id);

                selectedRole = selectedRole ?? new string[] { };

                var result = await UserManager.AddToRolesAsync(user.Id, selectedRole.Except(userRoles).ToArray());

                if (!result.Succeeded)
                {
                    ModelState.AddModelError("", result.Errors.First());
                    return View();
                }
                result = await UserManager.RemoveFromRolesAsync(user.Id, userRoles.Except(selectedRole).ToArray());

                if (!result.Succeeded)
                {
                    ModelState.AddModelError("", result.Errors.First());
                    return View();
                }
                return RedirectToAction("Index");
            }
            ModelState.AddModelError("", "Something failed.");
            return View();
        }

        //
        // GET: /Users/Delete/5
        public async Task Delete(string id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var user = await UserManager.FindByIdAsync(id);
            if (user == null)
            {
                return HttpNotFound();
            }
            return View(user);
        }

        //
        // POST: /Users/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task DeleteConfirmed(string id)
        {
            if (ModelState.IsValid)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }

                var user = await UserManager.FindByIdAsync(id);
                if (user == null)
                {
                    return HttpNotFound();
                }
                var result = await UserManager.DeleteAsync(user);
                if (!result.Succeeded)
                {
                    ModelState.AddModelError("", result.Errors.First());
                    return View();
                }
                return RedirectToAction("Index");
            }
            return View();
        }
    }
}

一般的にはユーザーの編集と削除です.次に、ロールの編集と削除について説明します.RolesAdminController

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.AspNet.Identity.EntityFramework;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using System.Collections.Generic;
using AxCMS.Models;
namespace AxCMS.Controllers
{
    [Authorize(Roles = "Admin")]
    public class RolesAdminController : Controller
    {
        public RolesAdminController()
        {
        }

        public RolesAdminController(ApplicationUserManager userManager,
            ApplicationRoleManager roleManager)
        {
            UserManager = userManager;
            RoleManager = roleManager;
        }

        private ApplicationUserManager _userManager;
        public ApplicationUserManager UserManager
        {
            get
            {
                return _userManager ?? HttpContext.GetOwinContext().GetUserManager();
            }
            set
            {
                _userManager = value;
            }
        }

        private ApplicationRoleManager _roleManager;
        public ApplicationRoleManager RoleManager
        {
            get
            {
                return _roleManager ?? HttpContext.GetOwinContext().Get();
            }
            private set
            {
                _roleManager = value;
            }
        }

        //
        // GET: /Roles/
        public ActionResult Index()
        {
            return View(RoleManager.Roles);
        }

        //
        // GET: /Roles/Details/5
        public async Task Details(string id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var role = await RoleManager.FindByIdAsync(id);
            // Get the list of Users in this Role
            var users = new List();

            // Get the list of Users in this Role
            foreach (var user in UserManager.Users.ToList())
            {
                if (await UserManager.IsInRoleAsync(user.Id, role.Name))
                {
                    users.Add(user);
                }
            }

            ViewBag.Users = users;
            ViewBag.UserCount = users.Count();
            return View(role);
        }

        //
        // GET: /Roles/Create
        public ActionResult Create()
        {
            return View();
        }

        //
        // POST: /Roles/Create
        [HttpPost]
        public async Task Create(RoleViewModel roleViewModel)
        {
            if (ModelState.IsValid)
            {
                var role = new IdentityRole(roleViewModel.Name);
                var roleresult = await RoleManager.CreateAsync(role);
                if (!roleresult.Succeeded)
                {
                    ModelState.AddModelError("", roleresult.Errors.First());
                    return View();
                }
                return RedirectToAction("Index");
            }
            return View();
        }

        //
        // GET: /Roles/Edit/Admin
        public async Task Edit(string id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var role = await RoleManager.FindByIdAsync(id);
            if (role == null)
            {
                return HttpNotFound();
            }
            RoleViewModel roleModel = new RoleViewModel { Id = role.Id, Name = role.Name };
            return View(roleModel);
        }

        //
        // POST: /Roles/Edit/5
        [HttpPost]

        [ValidateAntiForgeryToken]
        public async Task Edit([Bind(Include = "Name,Id")] RoleViewModel roleModel)
        {
            if (ModelState.IsValid)
            {
                var role = await RoleManager.FindByIdAsync(roleModel.Id);
                role.Name = roleModel.Name;
                await RoleManager.UpdateAsync(role);
                return RedirectToAction("Index");
            }
            return View();
        }

        //
        // GET: /Roles/Delete/5
        public async Task Delete(string id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var role = await RoleManager.FindByIdAsync(id);
            if (role == null)
            {
                return HttpNotFound();
            }
            return View(role);
        }

        //
        // POST: /Roles/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task DeleteConfirmed(string id, string deleteUser)
        {
            if (ModelState.IsValid)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                var role = await RoleManager.FindByIdAsync(id);
                if (role == null)
                {
                    return HttpNotFound();
                }
                IdentityResult result;
                if (deleteUser != null)
                {
                    result = await RoleManager.DeleteAsync(role);
                }
                else
                {
                    result = await RoleManager.DeleteAsync(role);
                }
                if (!result.Succeeded)
                {
                    ModelState.AddModelError("", result.Errors.First());
                    return View();
                }
                return RedirectToAction("Index");
            }
            return View();
        }
    }
}

ビューではNugetにアップロードし、パッケージインストールマネージャコンソールにInstall-Package AxCMSと入力すればいいです.
次のポイントは、Detailsビューでコメントの内容とコメントのフォームを追加する方法について説明します.これはASPによる比較的実用的な方法である.NET生成のデフォルト増分修正は便利ですが、私たちの様々な要求を満たすことはできません.
次の難点は、複数のモデルが1つのビューに対して、この文章の詳細ページは1つのモデルに属し、コメントは別のモデルに属していることです.ページを生成しなくてもいいですが、大きなモデルを作成しなければなりません.
public class BigModel
    {
        
        public Contents contents { get; set; }
        public List usercomments { get; set; }
    }

コントローラ側のコードでは、idに対応する文章を検索してから、このidに基づいて、もう一度クエリーをして、コメントも検索します.
public ActionResult Index(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            ViewBag.forid = id;
            BigModel bigmodel = new BigModel();
            bigmodel.usercomments = (from u in db.UserCommments where u.ContentsId == id select u).ToList();
            bigmodel.contents = (from c in db.Contents where c.ContentsId == id select c).FirstOrDefault();
            if (bigmodel== null)
            {
                return HttpNotFound();
            }
            return View(bigmodel);

        }

ビューは比較的簡単で、modelをBigModelとし、2つの小さなインスタンスmodelが含まれています.

@model AxCMS.Models.BigModel
@{
    ViewBag.Title = "Index";
}


@Html.DisplayNameFor(model=>model.contents.Title)
@Html.DisplayFor(model=>model.contents.Title)
@Html.DisplayNameFor(model => model.contents.User)
@Html.DisplayFor(model => model.contents.User)
@Html.DisplayNameFor(model => model.contents.Content)
@Html.DisplayFor(model => model.contents.Content)
    @foreach(var b in Model.usercomments) {
  • @Html.DisplayFor(model=>b.Comments)
  • }
@section Scripts { @Scripts.Render("~/bundles/jqueryval") }

コメントを発表するスペースが残っていることがわかります.
コメントを発表する方法はいくつかありますが、MVC構造に適した方法で作成し、まずBigModelを修正します.
public class BigModel
    {
        
        public Contents contents { get; set; }
        public List usercomments { get; set; }
        public UserCommments usercommentss { get; set; }
    }

ビューにコメントを発表するフォームを追加します.@if (Request.IsAuthenticated && User.IsInRole("Admin"))です.ここでは、キャラクター名がAdminでなければコメントを表示できないフォームを制限しています.後ろのUserを変更したり削除したりすることができます.IsInRole(「Admin」)は、ユーザーにログインするだけでコメントを発表できるようになりました.
@if (Request.IsAuthenticated && User.IsInRole("Admin"))
{
    using (Html.BeginForm("Indexsave", "Test"))
    {
        @Html.AntiForgeryToken()
        
        @Html.EditorFor(m=>m.usercommentss.Comments)
       
        
    }
}

最後に、コントローラで変更し、次のコードを追加します.
@if (Request.IsAuthenticated && User.IsInRole("Admin"))
{
    using (Html.BeginForm("Indexsave", "Test"))
    {
        @Html.AntiForgeryToken()
        
        @Html.EditorFor(m=>m.usercommentss.Comments)
       
        
    }
}

はい、この基本的なCMSはすでに完成して、これらのコードはすべて最も基本的なコードで、それは少しの構想を提供して、もちろんその入門の知識点です.
残念なことに、この例にAJAXの例を入れることができませんでした.この例にデータベースを入れてJSONを生成し、JSON AJAXを読み込んでからビューのチュートリアルに行きたいと思っています.次の機会にまた話しましょう.
ありがとうございました.投稿するときは涼しい風を楽しんでください.Netで署名します.自由転載-非商用-非派生-署名保持(クリエイティブ共有3.0ライセンス)