در این اموزش قصد داریم مروری بر نحوه ایجاد اتصال داده ای سفارشی جهت درخواست بر روی مدل موجود در پروژه داشته باشیم.
همانطور که می دانیم asp.net core قابلیت map کردن عناصر درون view با مدلهایی که بعنوان ورودی اکشنها است را دارد.
در این مثال با استفاده از اینترفیس IModelBinder جهت ایجاد انقیاد داده سفارشی بر روی کلاس User می پردازیم.
برای شروع یک پروژه از نوع Asp.net core (MVC) ایجاد میکنیم.
مساله ما در این پروژه فرضی به این صورت می باشد که بتوانیم با استفاده از ModelBinder خاصیت Username از کلاس User را بصورت خصوصی عملیات انقیاد داده ای را انجام دهیم. بنابر این یک کلاس با نام User بصورت زیر ایجاد میکنیم.
public class User
{
public string Username { get; set; }
}
سپس اکشنهای Index را صورت زیر در کنترلر درج میکنیم.
public IActionResult Index()
{
return View(User);
}
[HttpPost]
public IActionResult Index(User User)
{
return View();
}
سعی ما بر این است تا قبل از اینکه نگاشت دادهای فیلد Username در ویوی مورد نظر بر روی شیئ ,User از اکشن Index انجام گیرد ، با استفاده از Custom Model Binder تمام حروف بزرگ فیلد Username را به حروف کوچک تبدیل نماییم .
در ادامه ویوی index را بصورت زیر ایجاد می کنیم
@model ModelBinderSample.Models.User
@{
ViewData["Title"] = "Home Page";
}
<form method="post">
<div class="form-group">
<label asp-for="@Model.Username"></label>
<input type="text" asp-for="Username" class="form-control" />
<span asp-validation-for="Username" class="text-danger"></span>
</div>
<button class="btn btn-success">ارسال</button>
</form>
سپس کلاس ManagerUsername را که برای نگاشت اختصاصی فیلد Username موزد استفاده قرار خواهد گرفت را بصورت زیر ایجاد میکنیم.
public class ManageUsername : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var modelName = bindingContext.ModelName;//==> for username
// Try to fetch the value of the argument by name
var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);
if (valueProviderResult == ValueProviderResult.None)
{
return Task.CompletedTask;
}
var user = valueProviderResult.FirstValue;
if(string.IsNullOrEmpty(user))
{
return Task.CompletedTask;
}
user = user.ToLower();
bindingContext.Result = ModelBindingResult.Success(user);
return Task.CompletedTask;
}
}
در کلاس فوق متغیر user جهت دریافت مقدار Username از ویوی index مورد استفاده قرار میگیرد و در قسمتهای پایینتر کدهای فوق عملیات تبدیل حروف کوچک به بزرگ انجام میگیرد و در پایان Task با فرمان return Task.CompletedTask خاتمه می یابد.
اکنون جهت اتصال کلاس فوق به کلاس User جهت مدیریت Username ، باید کلاس User را بصورت زیر ویرایش کنیم.
public class User
{
[ModelBinder(typeof(ManageUsername))]
public string Username { get; set; }
}