آموزش 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 باید مد نظر قرار داد:
- خروجی تابع باید از نوع Json باشد،
- توسط JsonRequestBehavior.AllowGetمی توانید اجازه دهید که اطلاعات دوباره ثبت شود
- اگر مقدار خروجی را هر چیزی به جز true تنظیم نمایید، به این معنا است که اطلاعات ارسالی از سوی کاربر نامعتبر بوده است.
- اگر می خواهید پیغام خطایی یکسان برای همه ی حالتهای شما ارسال شود کافی است تغییرات زیر را به 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 ایجاد کردید.
چون دوستان عرض کردند خیلی از مفاهیم ابتدایی را توضیح می دهم از بسیاری از موارد چشم پوشی کردم تا انشالله مطالب خسته کننده نشوند.
علی میلادیان
با این روشی که شما بالا توضیح دادید هیچ گنه مشکلی نیست چون کلاسی که دارای Attribute /
علی میلادیان
سلام جناب شیدایی /
اسماعیلشیدایی
با عرض سلام
هیچ مشکلی نیست، همانطور که قبلا عرض کردم کافی است شما مانند فراخوانی یک متد از کلاسی که در Solution دیگر قرار دارد، عمل کنید. بدین صورت که باید اولا پروژه Model شما به پروژه ای که متد CheckName شما در آن نوشته شده است Reference داشته باشد و ثانیا در ابتدا Model ایی که می خواهید در آن از دستور [Remote("CheckName","Home")] استفاده کنید NameSpace پروژه مربوط به CheckName را اضافه کنید.
موفق باشید
علی میلادیان
سلام آقای شیدایی
اسماعیلشیدایی
با عرض سلام
اگر به فایل ها کلاس های پروژه دیگرتان از طریق این Solution دسترسی دارید کافی است مسیر کامل Controller را مشخص کنید در غیر این صورت بر روی پروژه ای که میخواهید از کلاس های دیگر پروژه ها در آن استفاده کنید کلیک راست کنید و گزینه Add Reference را انتخاب و Solution مورد نظر را Add کنید.
ابتدا یک کلاس را که در پروژه دیگر موجود است فراخوانی کنید تا مطمئن شوید دسترسی لاتم برای پروژه دیگر موجود است.
موفق باشید
علی میلادیان
سلام آقای شیدایی . وقت شما بخیر
اسماعیلشیدایی
با عرض سلام
هیچ تفاوتی وجود ندارد، کافی است namespace های خود را معرفی کنید و سپس Controller و Action خود را فراخوانی کنید
موفق باشید