آموزش Remote  در asp.net mvc

آموزش Remote در asp.net mvc

بسم الله الرحمن الرحیم

 آموزش asp.net mvc

برای تعیین اعتبار یک فیلد مجموعه از DataAnnotations لازم ارائه گردید. قابلیت دیگری برای چک کردن یک مقدار وجود دارد که به صورت Ajax عمل می کند و از لود شدن دوباره یک صفحه جلوگیری می کند. طبیعتا همه ما فیلد نام کاربری مربوط به ثبت نام را درسایت های مختلف تکمیل کرده ایم و دیده ایم چطور وقتی که یک نام کاربری تکراری ثبت می کنیم خطای مربوطه را نمایش می دهد.

برای شروع کار یک پروژه جدید MVC ایجاد می کنیم و در بخش Model یک کلاس جدید با نام Account ایجاد و کد زیر را در آن می نویسیم:

namespace MvcApplication2.Models

{
    [Table("Account")]
    public class Account

    {

        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Required]
        [Display(Name = "User name")]
        [Remote("ValidateUserName", "Account")]
        public string Use

بسم الله الرحمن الرحیم

 آموزش asp.net mvc

برای تعیین اعتبار یک فیلد مجموعه از DataAnnotations لازم ارائه گردید. قابلیت دیگری برای چک کردن یک مقدار وجود دارد که به صورت Ajax عمل می کند و از لود شدن دوباره یک صفحه جلوگیری می کند. طبیعتا همه ما فیلد نام کاربری مربوط به ثبت نام را درسایت های مختلف تکمیل کرده ایم و دیده ایم چطور وقتی که یک نام کاربری تکراری ثبت می کنیم خطای مربوطه را نمایش می دهد.

برای شروع کار یک پروژه جدید MVC ایجاد می کنیم و در بخش Model یک کلاس جدید با نام Account ایجاد و کد زیر را در آن می نویسیم:

namespace MvcApplication2.Models

{
    [Table("Account")]
    public class Account

    {

        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Required]
        [Display(Name = "User name")]
        [Remote("ValidateUserName", "Account")]
        public string UserName { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]

        [DataType(DataType.Password)]
        [Display(Name = "New password")]
        public string NewPassword { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm new password")]
        [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]

        public string ConfirmPassword { get; set; }

    }

}

خوب حال از روی  Model  یک کنترلر ایجاد می کنیم و کد زیر را به کنترلر اضافه می کنیم


namespace MvcApplication2.Controllers
{
    public class AccountController : Controller

    {
        private AccountContext db = new AccountContext();
//Remote Validation/////////////////////////////////////////////////////////////////////
        public JsonResult ValidateUserName(string userName)
        {
            switch (userName)

            {
                case "ESH":
                    return Json( "your userName is not valid,please Select new UserName!", JsonRequestBehavior.AllowGet);

                case "admin":
                    return Json("you cannot select this userName", JsonRequestBehavior.AllowGet);

            }
            return Json(true, JsonRequestBehavior.AllowGet);
        }

        //
        // GET: /Account/Create
        public ActionResult Create()

        {
            return View();
        }

        //
        // POST: /Account/Create
        [HttpPost]
        public ActionResult Create(Account account)
        {

            if (ModelState.IsValid)
            {
                db.Account.Add(account);
                db.SaveChanges();
                return RedirectToAction("Index");

            }
            return View(account);
        }

        protected override void Dispose(bool disposing)

        {
            db.Dispose();
            base.Dispose(disposing);

        }
    }

}

پس از ایجاد view مورد نظر، برنامه را اجرا کنید و در باکس مربوط به نام کاربری مقدار admin و مقدار esmaeil را وارد کنید.

همانطور که مشاهده می کنید بدون آنکه صفحه Refresh شود خطای شما مشابه سایر خطاهای سمت کلاینت نمایش داده می شود.

چند نکته را در ارتباط با Remote باید مد نظر قرار داد:

  1.  خروجی تابع باید از نوع Json باشد،
  2. توسط   JsonRequestBehavior.AllowGetمی توانید اجازه دهید که اطلاعات دوباره ثبت شود
  3.  اگر مقدار خروجی را هر چیزی به جز true تنظیم نمایید، به این معنا است که اطلاعات ارسالی از سوی کاربر نامعتبر بوده است.
  4. اگر می خواهید پیغام خطایی یکسان برای همه ی حالتهای شما ارسال شود کافی است تغییرات زیر را به Model و کنترلر اضافه نمایید:

 public JsonResult ValidateUserName(string userName)
        {
            switch (userName)
            {
                case "ESH":
                    return Json(false, JsonRequestBehavior.AllowGet);
                case "admin":
                    return Json(false, JsonRequestBehavior.AllowGet)
            }
            return Json(true, JsonRequestBehavior.AllowGet);
        }

همانطور که مشخص است بخش مربوط به متن پیام حذف شده و به جای آن کلمه false قید شده است. حال باید در Model نیز دستور Remote به صورت زیر تغییر داده شود:

 

[Remote("ValidateUserName", "Account",ErrorMessage="Please Type new UserName")]

این DataAnnotations سه بخش دارد بخش اول معرف نام اکشن مربوطه است، بخش دوم مربوط به کنترلر است و در نهایت بخش آخر پیام خطایی است که می خواهید برای کاربر نمایش داده شود. در صورتی که پیام را مشخص نکنید به صورت پیش فرض پیامی نمایش داده خواهد شد.

 به همین سادگی یک ارسال و دریافت Ajax ایجاد کردید.

چون دوستان عرض کردند خیلی از مفاهیم ابتدایی را توضیح می دهم از بسیاری از موارد چشم پوشی کردم تا انشالله مطالب خسته کننده نشوند.

نظرات

  • Hannah Martinez
    علی میلادیان
    دو شنبه 11 دی 1278 - 0:00

    با این روشی که شما بالا توضیح دادید هیچ گنه مشکلی نیست چون کلاسی که دارای Attribute / 

    Remote  است در پوشه Model  پروژه MVC  است ولی روشی را در نظر بگیرد که کلاس در یک
    لایبرری جداگانه باشد /
    باز هم ممنون 

  • Hannah Martinez
    علی میلادیان
    دو شنبه 11 دی 1278 - 0:00

    سلام جناب شیدایی / 

    من هر کاری کی می کنم  نمیشه . چون اون کلاس من که دارای Attribute / 
    Remote  است در یک کلاس Library  دیگری از همان Solution  است آدرس دهی به این روش جواب نمیدهد : [Remote("CheckName","Home")] 
    در اینجا چطوری باید مشخص کنیم که این آدرس در یک پروژه دیگر از همان Solution  است ؟ 
    ممنون

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

      هیچ مشکلی نیست، همانطور که قبلا عرض کردم کافی است شما مانند فراخوانی یک متد از کلاسی که در Solution دیگر قرار دارد، عمل کنید. بدین صورت که باید اولا پروژه Model شما به پروژه ای که متد CheckName شما در آن نوشته شده است Reference داشته باشد و ثانیا در ابتدا Model ایی که می خواهید در آن از دستور [Remote("CheckName","Home")]  استفاده کنید NameSpace پروژه مربوط به CheckName را اضافه کنید.

      موفق باشید

  • Hannah Martinez
    علی میلادیان
    دو شنبه 11 دی 1278 - 0:00

    سلام آقای شیدایی

    من هر کاری کردم نشد / من یک کلاس در یک class library  دارم می خواهم یکی از فیلد های کلاس با Remote  کار کنه : مثل این 
    [Remote("CheckName","Home")]
    ...............................................................حالا برای این چطوری باید namespace را مشخص کنم : اکشن CheckName  و کنترولر Home  که در یک پروژه دیگری از همان solution  است ... 
    هر کاری می کنم نمیشناسه ... 

    ممنون میشم راهنمایی کنید 

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

      اگر به فایل ها کلاس های پروژه دیگرتان از طریق این Solution دسترسی دارید کافی است مسیر کامل Controller را مشخص کنید در غیر این صورت بر روی پروژه ای که میخواهید از کلاس های دیگر پروژه ها در آن استفاده کنید کلیک راست کنید و گزینه Add Reference را انتخاب و Solution مورد نظر را Add کنید.
       ابتدا یک کلاس را که در پروژه دیگر موجود است فراخوانی کنید تا مطمئن شوید دسترسی لاتم برای پروژه دیگر موجود است.

      موفق باشید

  • Hannah Martinez
    علی میلادیان
    دو شنبه 11 دی 1278 - 0:00

    سلام آقای شیدایی . وقت شما بخیر 

    ممنون از شما .. 

    حالا اگر مدل ما در یک لایه دیگری باشد چطور می تونیم  اکشن مورد نظر را فراخوانی کنیم ؟ 
    ممنون

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

      هیچ تفاوتی وجود ندارد، کافی است namespace های خود را معرفی کنید و سپس Controller و Action خود را فراخوانی کنید

      موفق باشید

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس