二、Asp.Net MVC4.0 CMSシステム事例を開発するユーザー登録モジュール開発


前節では、データベースとデータテーブル構造を構築した後、vs 2012でMVC開発プロジェクトを新設しました.デフォルトのファイルの内容は説明しません.MVCの基礎知識については、ネット上で他のものを調べたり、私の他のブログの紹介を読んだりすることができます.
一、まずユーザーのModelモデルクラスを作成する.
1)ユーザー情報モデル
using System;
using System.ComponentModel.DataAnnotations;
namespace Hillstone.Models
{
    public class SysComUser
    {
        /// <summary>
        ///    Id
        /// </summary>
        [Key]
        public int UserId { get; set; }
        /// <summary>
        ///    
        /// </summary>
        [Display(Name="   ",Description="4-20   ")]
        [Required(ErrorMessage = "×")]
        [StringLength(20, MinimumLength = 4, ErrorMessage = "×")]
        public string LoginName { get; set; }
        /// <summary>
        ///    
        /// </summary>
        [Display(Name = "   ", Description = "4-20   ")]
        [Required(ErrorMessage = "×")]
        [StringLength(20, MinimumLength = 4, ErrorMessage = "×")]
        public string UserName { get; set; }
        /// <summary>
        ///     
        /// </summary>
        [Display(Name="    ")]
        [Required(ErrorMessage = "×")]
        [StringLength(50,MinimumLength=6,ErrorMessage="6-50   !")]
        [DataType(DataType.Password)]
        public string Password { get; set; }
        /// <summary>
        ///    
        /// </summary>
        [Display(Name = "  ")]
        public string OrderNo { get; set; }
        /// <summary>
        ///     :0-    ,1-    
        /// </summary>
        [Display(Name="    ")]
        public Nullable<int> UserType { get; set; }
        /// <summary>
        ///     :0-  ,1-  ,2-  
        /// </summary>
        [Display(Name = "    ")]
        public Nullable<int> Flag { get; set; }
        /// <summary>
        ///     ID
        /// </summary>
        [Display(Name = "    ")]
        public Nullable<int> UnitId { get; set; }
        /// <summary>
        ///     ID
        /// </summary>
        [Display(Name = "    ")] 
        public Nullable<int> PosId { get; set; }
        /// <summary>
        ///    ID
        /// </summary>
        [Display(Name = "   ID")]         
        public Nullable<int> CreatedUserId { get; set; }
        /// <summary>
        ///      
        /// </summary>
        [Display(Name = "   ")]
        public string CreatedUserName { get; set; }
        /// <summary>
        ///     
        /// </summary>
        [Display(Name = "    ")]
        [DataType(DataType.DateTime)]
        //[DisplayFormat(DataFormatString="{0:yy-mm-dd}")]
        public Nullable<System.DateTime> CreatedDate { get; set; }
        /// <summary>
        ///        
        ///public virtual ICollection<SysComGroupUser> sysComGroupUser { get; set; }
        ///</summary>
    }
}

プライマリ・キーに[key]を付ける必要があります.そうしないと、インスタンス呼び出しでエラーが発生します.[Display]ビューページに表示するプロパティの名前と説明
StringLenth設定フィールドの長さ範囲とエラーメッセージ、Required必須項目要求、DataTypeデータ型、Passwordパスワード、DataTime時間などがあります.DisplayFormatフォーマット表示の式.
2)ユーザー登録モデル
using System.ComponentModel.DataAnnotations;
namespace Hillstone.Models
{
    public class SysComUserRegister:SysComUser
    {
        [Display(Name="    ",Description="6-20   ")]
        [Required(ErrorMessage = "×")]
        [StringLength(20,MinimumLength=6,ErrorMessage="×")]
        [DataType(DataType.Password)]
        public new string Password { get; set; }
        
        [Display(Name="    ",Description="        !")]
        [Required(ErrorMessage = "×")]
        [Compare("Password",ErrorMessage="×")]
        [DataType(DataType.Password)]
        public string RPassword { get; set; }
        
        [Display(Name="   ",Description="          !")]
        [Required(ErrorMessage="×")]
        [StringLength(4,MinimumLength=4,ErrorMessage="×")]
        public string VerificationCode { get; set; }
        
         /// <summary>
        ///         
        /// </summary>
        /// <returns></returns>
        public SysComUser GetUser()
        {
            return new SysComUser {
                LoginName = this.LoginName,
                UserName = this.UserName,
                UserType = this.UserType,
                UnitId = this.UnitId, 
                Password = this.Password,
                PosId = this.PosId,
                Flag = this.Flag,
                OrderNo = this.OrderNo,
                CreatedUserId = this.CreatedUserId,
                CreatedDate = this.CreatedDate,
                CreatedUserName = this.CreatedUserName
            };
        }
    }
}

ユーザー登録ではパスワードと認証コードをデータベースに書き込む必要がないことを確認するため、モデルを個別に作成する必要がありますが、登録時に表示される内容の大部分はユーザー情報モデルにあるので、ここではSysComUserクラスを継承し、直接参照できます.パスワードにマッピングされている[Compare]が一致しているかどうかを確認します.ここからモデルが何であるかがわかりますが、実はClassで、属性定義やメソッド定義ができます.基本的には以前のASP.NETは開発時の差は少なく,フィールドの検証ルールなどにすぎず,より多くのオブジェクトマッピング技術を採用している.
    
二、次にユーザーContrallersコントローラを創立する
1)すべてのコードは以下の通りです.
using System.Web.Mvc;
using System.Drawing;
using Hillstone.Models;
using Hillstone.Common;
namespace Hillstone.Controllers
{
    public class SysComUserController : Controller
    {
        /// <summary>
        ///         
        /// </summary>
        /// <returns></returns>
        public ActionResult UserRegister()
        {
            ViewData["Flag"] = Function.getSelectList();
            return View();
        }
        /// <summary>
        ///         
        /// </summary>
        /// <param name="users"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult UserRegister(SysComUser users)
        {
            return View();
        
        }
        /// <summary>
        ///      
        /// </summary>
        /// <returns></returns>
        public ActionResult VerificationCode()
        {
            //     
            int _verificationLength = 4;
            int _width = 100, _height = 20;
            SizeF _verificationTextSize;
            Bitmap _bitmap = new Bitmap(Server.MapPath("~/Skins/Common/VerificationCode.png"), true);
            TextureBrush _brush = new TextureBrush(_bitmap);
            //     
            string _verificationText = Common.Text.VerificationText(_verificationLength);
            //     
            Session["VerificationCode"] = _verificationText.ToUpper();
            Font _font = new Font("Arial", 14, FontStyle.Bold);
            Bitmap _image = new Bitmap(_width, _height);
            Graphics _g = Graphics.FromImage(_image);
            //     
            _g.Clear(Color.White);
            //     
            _verificationTextSize = _g.MeasureString(_verificationText, _font);
            _g.DrawString(_verificationText, _font, _brush, (_width - _verificationTextSize.Width) / 2, (_height - _verificationTextSize.Height) / 2);
            _image.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            return null;
        }
    }
}

2)ユーザ登録においてまず考慮すべきことは検証コード機能の実現であり、ここではVerificationCode()メソッドを定義して検証コードを描画し、キャッシュ中のBitmapを描画検証コードの材質として読み出す.認証コードの取得方法VerificationText()パラメータは返す検証コードの個数であり、これは一般的な方法であるため、彼を1つのクラスに単独で置き、Commonフォルダを新規作成し、Textを追加する.csクラス.この方法をこのようなものに書くと、テキストの文字処理に関するすべての機能がここに書くことができます.管理と使用が容易です.次のようになります.
using System;
namespace Hillstone.Common
{
    public class Text
    {
        public static string VerificationText(int length)
        {
            char[] _verificationText = new char[length];
            char[] _dictionary = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
            Random _random = new Random();
            
            for (int i = 0; i <= length - 1; i++)
            {
                int _number = _random.Next(_dictionary.Length - 1);
                _verificationText[i] = _dictionary[_number];
            }
            return new string(_verificationText);
        }
    }
}

ネーミングスペースが異なるため、このメソッドを呼び出すファイルで参照します.
using namespace Hillstone.Common

できます.
3)ユーザの登録はデータへのアクセス,データのライブラリCRDU操作に関わる.ユーザのコントローラSysComUserContrallersクラスでの登録などの方法で書き込みがない、データ操作動作を行い、Contextを作成してEFに対する操作を実現し、DBContextと継承する.管理と規範を容易にするために、すべてのデータに対する添削改査機能などを抽象的に1つのクラスにし、インタフェース方式で規範基準を統一し、継承クラスではこれらのインタフェース基準を実現しなければならない.次のようになります.
using System.Data.Entity;
using Hillstone.Models;
namespace Hillstone.DAL
{
    public class HillstoneContext:DbContext
    {
        /// <summary>
        ///         
        /// </summary>
        public HillstoneContext()
            : base("name=DefaultConnection")
        { 
        }
        //                 ,          
        public DbSet<SysComUser> SysComUser { get; set; }
    }
}

インタフェースクラスIresponsitoryBase
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Hillstone.DAL
namespace Hillstone.BLL
{
    public class IRepositoryBase<TModel>
    {
        private HillstoneContext dbContext;
        public IRepositoryBase()
        {
             dbContext = new HillstoneContext();
        }
        /// <summary>
        ///   【            】
        /// </summary>
        /// <param name="Tmodel">  Model     </param>
        /// <returns>   </returns>
        public virtual bool Add(TModel Tmodel) { return false; }
        /// <summary>
        ///   【            】
        /// </summary>
        /// <param name="Tmodel">  Model     </param>
        /// <returns>   </returns>
        public virtual bool Update(TModel Tmodel) { return false; }
        /// <summary>
        ///      【            】
        /// </summary>
        /// <param name="Id">    ID </param>
        /// <returns>   </returns>
        public virtual bool Delete(int Id) { return false; }
        /// <summary>
        ///      【            】
        /// </summary>
        /// <param name="Id">    ID </param>
        /// <returns>Model     </returns>
        public virtual TModel Find(int Id) { return default(TModel); }
        /// <summary>
        ///      
        /// </summary>
        ~IRepositoryBase()
        {
            if (dbContext!=null)
            {
                dbContext.Dispose();
            }
        }
    }
}

4)ユーザーのデータ操作クラスSysComUserRepositoryを作成し、IresponsitoryBaseというインタフェースを継承する、追加、削除、変更、検索などの方法で書き換えを実現する.次のように
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Hillstone.Models;
namespace Hillstone.BLL
{
    public class SysComUserRepository : IRepositoryBase<Hillstone.Models.SysComUser>
    {
        private HillstoneContext dbContext;
        public SysComUserRepository()
        {
            dbContext = new HillstoneContext();
        }
        /// <summary>
        ///         
        /// </summary>
        /// <param name="Tmodel">      </param>
        /// <returns>   </returns>
        public override bool Add(SysComUser Tmodel)
        {
            if (Tmodel == null) { return false; }
            dbContext.SysComUser.Add(Tmodel);
            if (dbContext.SaveChanges() > 0){
                return true;
            }else{
                return false;
            }
        }
        /// <summary>
        ///         
        /// </summary>
        /// <param name="Tmodel">      </param>
        /// <returns>   </returns>
        public override bool Update(SysComUser Tmodel)
        {
            if (Tmodel == null) { return false; }
            var _tmodel = dbContext.SysComUser.FirstOrDefault(u => u.UserId == Tmodel.UserId);
            if (_tmodel == null) { return false; }
            _tmodel = Tmodel;
            if (dbContext.SaveChanges() > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

5)完了後、SysComUserContrallersクラスでusing Hillstoneを参照する.BLL;オブジェクトをインスタンス化
SysComUserRepository userRepository = new SysComUserRepository();次はそれを使って実現します
UserRegister()メソッド.
コードは次のとおりです.
        [HttpPost]
        public ActionResult UserRegister(SysComUserRegister userRegs)
        {
            if (string.IsNullOrEmpty(Session["VerificationCode"].ToString()))
            {
                //         !
                ModelState.AddModelError("VerificationCode", "×");
                return View();
            }
            else if (Session["VerificationCode"].ToString() != userRegs.VerificationCode)
            {
                //         
                ModelState.AddModelError("VerificationCode", "×");
                return View();
            }
            else { 
                //               
                if (userRepository.IsExists(userRegs.LoginName))
                {
                    ModelState.AddModelError("LoginName", "         !");
                    return View();
                }
                else {
                    //        
                    SysComUser userInfo = userRegs.getUsers();
                    if (userRepository.Add(userInfo))
                    {
                        return View();
                    }
                    else {
                        return View();
                    }
                }
            }
        
        }

2つの方法があるIsExit(LoginName)このログイン名が存在するかどうかとuserRepository.Add(SysComUser)は、ユーザー情報を追加します.具体的なコードは以下の通りです.
        /// <summary>
        ///              
        /// </summary>
        /// <param name="LoginName">   </param>
        /// <returns>   :  </returns>
        public bool IsExists(string LoginName)
        {
            if (dbContext.SysComUser.Any(u => u.LoginName.ToUpper() == LoginName.ToUpper()))
            {
                return true;
            }
            else { return false; }
        }

6)ビューを作成し、以下のように自動的に生成します.
@model Hillstone.Models.SysComUserRegister
@{
    ViewBag.Title = "    ";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>    </h2>
@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>    </legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.LoginName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.LoginName)
            @Html.ValidationMessageFor(model => model.LoginName)
            @Html.DisplayDescriptionFor(model => model.LoginName)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.UserName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.UserName)
            @Html.ValidationMessageFor(model => model.UserName)
            @Html.DisplayDescriptionFor(model => model.UserName)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Password)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Password)
            @Html.ValidationMessageFor(model => model.Password)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.RPassword)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.RPassword)
            @Html.ValidationMessageFor(model => model.RPassword)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.VerificationCode)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.VerificationCode)
            @Html.ValidationMessageFor(model => model.VerificationCode)
            <img id="verificationcode" alt="   " src="@Url.Action("VerificationCode", "SysComUser")" />
            <a id="trydifferent" style="cursor:pointer" onclick="VerificationChange()">   </a>
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.OrderNo)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.OrderNo)
            @Html.ValidationMessageFor(model => model.OrderNo)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.UserType)
        </div>
        <div class="editor-field">
            @Html.RadioButton("UserType",0,true)      
            @Html.RadioButton("UserType",1)     
            @Html.ValidationMessageFor(model => model.UserType)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Flag)
        </div>
        <div class="editor-field">
            @Html.DropDownList("Flag",ViewData["Flag"] as SelectList)
            @Html.ValidationMessageFor(model => model.Flag)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.UnitId)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.UnitId)
            @Html.ValidationMessageFor(model => model.UnitId)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.PosId)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.PosId)
            @Html.ValidationMessageFor(model => model.PosId)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.CreatedUserId)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.CreatedUserId)
            @Html.ValidationMessageFor(model => model.CreatedUserId)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.CreatedUserName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.CreatedUserName)
            @Html.ValidationMessageFor(model => model.CreatedUserName)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.CreatedDate)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.CreatedDate)
            @Html.ValidationMessageFor(model => model.CreatedDate)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>
<script type="text/javascript" >
    function VerificationChange() {
        $("#verificationcode").attr("src", "/SysComUser/VerificationCode?" + new Date());
    }
   
</script>
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

    7)@html.DisplayDescriptionFor(model=>model.LoginName)メソッドでは、拡張子を独自に定義する必要があります.拡張コンテンツをExtensionsフォルダの下に配置し、DisplayDescriptionExtensionsを追加します.csファイルクラス、コードは以下の通りです.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Linq.Expressions;//        、                              。    Expression            ,               。
using System.Web.Mvc;
using System.Web.Mvc.Html;
namespace System.Web.Mvc.Html
{
    public static class DisplayDescriptionExtensions
    {
        /// <summary>
        ///     :  HTML               
        /// </summary>
        /// <param name="htmlHelper">HTML  </param>
        /// <param name="name">    </param>
        /// <returns>      :      </returns>
        public static MvcHtmlString DisplayDescription(this HtmlHelper htmlHelper,string name)
        {
            //               :   1     :name,  2、      :ViewData,3、   :      
            ModelMetadata _modelMetadata = ModelMetadata.FromStringExpression(name, htmlHelper.ViewData);
            //        ,   HTML ��a   ,     cs      HTML      view .
            return MvcHtmlString.Create(_modelMetadata.Description);
        }
        /// <summary>
        ///         :  lamba           ,   intellisense  
        /// </summary>
        /// <typeparam name="TModel">       </typeparam>
        /// <typeparam name="TResult">     </typeparam>
        /// <param name="htmlHelper">         HTML  </param>
        /// <param name="expression">            lambda          </param>
        /// <returns>      :      </returns>
        public static MvcHtmlString DisplayDescriptionFor<TModel, TResult>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel,TResult>> expression)
        {
            //     Expression        :  1、          :expression。2、      :ViewData。3、   :      。
            ModelMetadata _modelMetaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
            return MvcHtmlString.Create(_modelMetaData.Description);
        }
    }
}

本文は“走る小さいカタツムリ-オリジナルの空間”のブログから出て、転載をお断りします!