گاهی لازم است که هنگام وارد کردن اطلاعات در یک فرم, مقدار یکی از فیلدها را مورد بررسی قرار دهیم. به عنوان مثال هنگام ثبت نام کاربر در سایت نام کاربری یا شماره تلفن کاربر را میخواهیم بررسی کنیم که در دیتابیس موجود نباشد و اگر در دیتابیس رکوردی با آن نام کاربری یا شماره تلفن بود پیغام مورد نیاز را به کاربر نشان دهیم. برای این کار میتوانیم هنگامی که داده ها به سمت سرور ارسال میشوند فیلد موردنظر را بررسی کنیم که در دیتابیس وجود دارد یا نه. اما در این روش کل دیتای فرم به سمت سرور ارسال شده و اگر مقدار ارسال شده در دیتابیس موجود باشد کاربر باید مجددا داده ها را تغییر داده و ارسال کند. اما با استفاده از اتربیوت Remote میتوان در زمانی که کاربر مشغول وارد کردن مقدار فیلد مورنظر است مقدار وارد شده را به سمت سرور ارسال کرد. در این حالت فقط فیلد مورد نظر ( نه کل فرم ) به صورت Ajax به سمت سرور ارسال میشود. نحوه استفاده از این اتربیوت به صورت زیر است.

public class UserDto
{
    [Remote(action: "CheckUsername", controller: "User", areaName: "Admin", HttpMethod = "POST", ErrorMessage = "نام کاربری وارد شده قبلا در سایت ثبت شده است")]
    public string Username { get; set; }
    public string Password { get; set; }
    public string RePassword { get; set; }
}

در کد بالا نام کنترلر, اکشن و Area را مشخص کرده ایم که باید در کنترلر User در منطقه ی Admin یک اکشن ایجاد کنیم به نام CheckUsername که باید یک مقدار Json را برگردانیم. اگر مقدار Json برابر باشد با true یعنی مقدار فیلد موردنظر ( با توجه به سناریوی شما ) در دیتابیس موجود نیست و کاربر میتواند از آن نام کاربری استفاده کند. نحوه پیاده سازی کنترلر به صورت زیر است.

[Area("admin")]
public class UserController : Controller
{
    private readonly IUserService _userService;
    public UserController(IUserService userService)
    {
        _userService = userService;
    }
    [HttpPost, ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
    public async Task<IActionResult> CheckUsername(string Username)
    {
        bool isValidUsername = await _userService.CheckUsername(Username);
        return Json(isValidUsername);
    }
}

در ورودی اکشن CheckUsername مقدار فیلد Username به صورت خودکار ارسال میشود. نام پارامتر ورودی باید دقیقا همنام با فیلد تعریف شده در فرم ورودی باشد. در متد CheckUsername اینترفیس IUserService بررسی شده است که آیا نام کاربری با این نام وجود دارد یا نه. اگر وجود داشته باشد مقدار false برگردانده میشود و مقدار false به صورت json ارسال میشود و پیغام "نام کاربری وارد شده قبلا در سایت ثبت شده است" به کاربر نمایش داده خواهد شد. اگر بخواهیم هنگام بررسی فیلد مورنظر یک یا چند فیلد دیگر نیز بررسی شوند میتوانید از پراپرتی AdditionalFields استفاده کنید. این پراپرتی از نوع string است و نام سایر فیلدهای مورنیاز برای بررسی را قبول میکند. میتوانید چند فیلد را به صورت زیر ارسال کنید.

public class UserDto
{
    [Remote(action: "CheckUsername", controller: "User", areaName: "Admin",
        AdditionalFields = "Password,RePassword",
        HttpMethod = "POST", 
        ErrorMessage = "نام کاربری وارد شده قبلا در سایت ثبت شده است")]
    public string Username { get; set; }
    public string Password { get; set; }
    public string RePassword { get; set; }
}

در این صورت هنگام ارسال نام کاربری به اکشن CheckUsername مقدار فیلد های Password و RePassword نیز ارسال میشود و ورودی اکشن باید به صورت زیر تغییر کند.

[HttpPost, ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
public async Task<IActionResult> CheckUsername(string Username, string Password, string RePassword)
{
    var isValidUsername = await _userService.CheckUsername(Username);
    return Json(isValidUsername);
}

و در نهایت باید کتابخانه های جاوااسکریپتی برای اعتبار سنجی در سمت کلاینت را به صفحه اضافه کنیم.

<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
<script src="~/lib/jquery-ajax-unobtrusive/jquery.unobtrusive-ajax.min.js"></script>

;)

Powered by Froala Editor