جلوگیری از ثبت داده تکراری در Mvc 5

در این مقاله میخواهیم بررسی کنیم که چگونه میتوان در Mv5 از وارد کردن رکورد تکراری جلوگیری کنیم در برنامه ها واقعی وقتی امکان ثبت نام در سایت خود میگذارید باید بررسی کنید که یک فرد با یک نام یا یک ایمیل دو بار ثبت نام نکند و و قتی که یک کاربر با یک نام کاربری در سایت شما ثبت نام کرد بایستی این نام در بانک اطلاعاتی شما دخیره بشود و اگر کاربر با نام کاربری تکراری ثبت نام کرد بایستی یک پیغام خطا به کاربر نشان دهیم که این نام کاربری قبلا در سایت وجود دارد

جلوگیری از ثبت  داده تکراری  در Mvc 5

سلام دوستان

در این مقاله میخواهیم بررسی کنیم که چگونه  میتوان  در Mv5 از وارد کردن رکورد تکراری جلوگیری کنیم

در برنامه ها  واقعی  وقتی امکان ثبت نام  در سایت خود میگذارید باید  بررسی کنید که یک فرد با  یک نام یا یک ایمیل دو بار  ثبت نام نکند و و قتی که یک کاربر با یک نام کاربری در سایت شما  ثبت نام کرد بایستی این نام در بانک اطلاعاتی شما دخیره بشود  و اگر کاربر با نام کاربری تکراری ثبت نام کرد بایستی یک پیغام خطا به کاربر نشان دهیم که  این نام کاربری قبلا در سایت وجود دارد

دوستان دیگه توضیح کافی  است حالا بریم سراغ کد نویسی :

ما در این برنامه قصد داریم از روش Database First استفاده کینم پس ابتدا در بانک اطلاعاتی  یک دیتابیس با نام "db_UniqueUserName" ایجاد مکنیم حالا یک جدول با نام tblUser میسازیم

 

مرحله 2:

حالا ویژوال استادیو   را باز میکنیم  و یک  پروژه از نوع MVC 5 web application ایجاد میکنیم  

 

 

 

 

 

مرحله 3:

 پروژه را از نوع Emptyایجاد میکنیم  و نوع ان را از نوع Mvc میگذاریم

حالا در این مرحله می آییم بانک اطلاعاتی خود را  به برنامه  اضافه کنیم

همان طور که از شکل معلوم  است ما میخواهیم از EntityFromWork استفاده کنیم  برای این کار روی پروژه راست کلیک کرده و ADO.Net Entity Data را میزنیم

حالا بایستی یک اسم برای مدل خود انتخاب کنید

حال کزینه EF Designer from database. انتخاب میکنیم

 حالا Next را میزنیم  یک صفحه جدید دیگر باز میشودکه در Server Name: اسم بانک اطلاعاتی را میزنیم که اینجا چون همگی از sql server استفاده میکینیم و این نرم افزار روی سیستم ما  است بهتر  است که "." را بزنیم ( (دات) به این معناست که من به بانک اطلاعاتی  روی دستگاه  خودم وصل شدم ) البته به جای دات هم میشه از ادرس شبکه استفاه کرد ولی  بهتر است که از  همان دات استفاده کنیم.

در باکس log on  to server

دو گزینه و جود داردکه گزینه اول به این معناست  که شما بدون رمز و نام کاربری  وارد بانک اطلاعاتی خود میشوید

گزینه دوم به این معناست که شما اگر با نام کاربری و رمز وارد بانک اطلاعاتی خودتون شدید  باید  برای وصل شدن به بانک اطلاعاتی  رمز ورود و نام کاربری خود را وارد کنید

 

درگزینه select or enter a database Name  اسم بانک اطلاعاتی که سا ختیم را انتخاب  میکنیم

از radioButton  ها گزینه yes را انتخاب کنید و در قسمت پایین پنجره گزینه ذخیره رشته اتصال در فایل WebConfig را تیک  میزنیم.

دراین مرحله جداول  ای که ساختیم را انتخاب میکنیم

و در اخر گزینه Finish را میزنیم

پس از کلیک روی دکمه Finish جدول ما به ORM همانند شکل زیر اضافه میشود:

فقط باید ان نکته را یاداوری کنم که در آخر نیز  یکبار برنامه را Buildکنید (ترکیبی از Contr+Shift+B.)

 حالا مریم سراغ قسمت شیرین برنامه

همان طور که از تصویر معلوم است روی  Controller. راست کلیک کرده وAddرا میزنیم و       Controller.  از نوع    Controller with views, using Entity Framework. MVC 5   ایجاد میکنیم

در این  مرحله شما بایستی اسم  کلاس (که همان جدولی است که ساختیم  را انتخاب میکنیم)و اسم مدلی که از پایگاه داده را با ان فراخوانی کردیم (همان توضیحی که بالا دادم ) را انتخاب کنم

Model class : User             

Data Context class :UserDbContext

 

و اکنون  از برنامه اجرا مگیریم و شروع به ثبت داده میکنیم

همانطور که مشاهده میکنید داده هایی که ثبت میکنیم در بانک اطلاعاتی ذخیره میشود

حالا دوباره یک  داده به همان مشخصات قبلی  ثبت میکنیم   و همان طور که مشاهده میکنید اجازه ثبت این داده را به ما میدهد

که هدف ما از این اموزش این است که اجازه ثبت داده یکسان را به ما ندهد

حالا بریم سر اصل موضوع

 برای حل این مشکل ما بایستی از RemoteAttribute  استفاده کنیم

ابتدا وارد کنترلر صفحه میشیم  و قطعه کد زیر دا در کنتلرر خود اضافه میکنیم

    public JsonResult IsUserExists(string UserName)   
    {  
    //check if any of the UserName matches the UserName specified in the Parameter using the ANY extension method.  
    return Json(!db.Users.Any(x => x.UserName == UserName) ,JsonRequestBehavior.AllowGet);  
    }  

توضیح کد بالا: یک متد به نام IsUserExists از نوع JsonResult تعریف کرده  که در واقع چک میکند که دوتا اسم باهم برابر نباشد

شاید برای شما این سوال پیش بیاد که چرا ما از علامت مخالف(!) استفاده کردیم  هدف ما از این کار این است  هنگام برگشت json  یک پیغام به کاربر نشان دهیم در واقع هدفمان این است که اگر  اسم مشابه  ای که قبلا در بانک اطلاعاتی ثبت شده است مجدد ثبت شود هم از ثبت شدن دوباره آن جلوگیری کند ( که البته برای این کار باید از 3عدد Script که در اخر  توضیح میدم هم استفاده شود) و هم یک پیغام خطا به کاربر نشان دهد .

و در مرحله بعد شما  یک کلاس درست میکنید که درآن کلاس،  یک property  به نام , UserName درست مکینم که در ان  بررس  میکنیم که میخواهیم این فیلد دوبار در سایت استفاده نشود

    using System.ComponentModel.DataAnnotations;  
    using System.Web.Mvc;   
    namespace UniqueField.Models 
    {  
       [MetadataType(typeof(UserMetaData))]  
       public partial class User 
       {  
       }  
    class UserMetaData 
    {  
       [Remote("IsUserExists","Home",ErrorMessage="این نام کاربری در سایت موجود است !!! ")]  
       public string UserName { get; set; }  
    }  
    }  

درآخر هم داخل View Createاین 3 تا Script را اضافه مکنیم که  باعث میشود قبل از ان که دکمه ثبت فشرده  شود  اگر دو داده مشابه در بانک اطلاعاتی بود پیغام خطا نشان داده میشود

<h2>ایجاد</h2>  
<script src="~/Scripts/jquery-1.10.2.js"></script>  
<script src="~/Scripts/jquery.validate.js"></script>  
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>

 

 

فایل های ضمیمه