PDA

View Full Version : مقاله: نحوه استفاده از ModelBinder ها در ASP.NET MVC



devhandler
سه شنبه 30 آذر 1389, 11:48 صبح
در این پست قصد دارم تا در مورد ModelBinder ها در ASP.NET MVC توضیح بدم. ModelBinder ها زمانی به کار می آیند که قصد داشته باشید مقادیر پارامتر ورودی یک Action رو از یک منبع دلخواه پر کنید. برای آشنایی بیشتر یک مثال میزنم. برای این مثال از ASP.NET MVC 3 RC2 استفاده کردم، کد این مثال با اندکی تغییر در MVC 2 هم قابل استفاده هست.
یک پروژه داخل Visual Studio 2010 ایجاد کنید و نام اون رو ModelBinding بذارید. یک View در مسیر Views/Home با نام Index اضافه کنید و کد داخل اون رو به صورت زیر تغییر بدید:


@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
<div>
@using (Html.BeginForm("Submit", "Home", FormMethod.Post))
{
<label>FirstName </label><input type="text" id="firstName" name="firstName" />
<label>FirstName </label><input type="text" id="lastName" name="lastName" />
<input type="submit" value="submit" />
}
</div>
</body>
</html>

در قدم بعدی یک Controller با نام Home اضافه کنید، کد این Controller به صورت زیر می باشد:


using System.Web.Mvc;
namespace ModelBinding.Controllers
{
public class HomeController : Controller
{
public ViewResult Index()
{
return View();
}

[HttpPost]
public ActionResult Submit(Models.Person person)
{
// put your code here...
return null;
}
}
}

یک Model هم با نام Person با کد زیر به Model های پروژه اضافه کنید:


namespace ModelBinding.Models
{
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
}

این مرحله ما می خواهیم بعد از کلیک کردن بر روی دکمه Submit در صفحه Index، عملیات داخل Submit Action در HomeController اجرا شود، اما یک مشکلی هست، پارامتر Person در حال حاضر null خواهد بود. برای حل این مشکل ما باید از ModelBinder ها استفاده کنیم، با استفاده از ModelBinder هنگام اجرای Action در صورتی که پارامتر ورودی Action مقدار داده نشده باشد، ModelBinder صدا زده شده و این پارامتر مقدار دهی می شود. برای مرحله بعدی، ما باید یک ModelBinder تعریف کنیم، برای این کار یک کلاس با نام PersonModelBinder تعریف کنید که این کلاس از کلاس DefaultModelBinder مشتق می شود:


using System.Web.Mvc;
namespace ModelBinding.Infrastructure
{
public class PersonModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if(bindingContext.ModelType == typeof(Models.Person))
{
var person = new Models.Person();
person.FirstName = controllerContext.HttpContext.Request.Form["firstName"];
person.LastName = controllerContext.HttpContext.Request.Form["lastName"];
return person;
}
return base.BindModel(controllerContext, bindingContext);
}
}
}

برای مرحله بعد، باید این ModelBinder به برنامه ما اضافه شود، برای این کار داخل فایل Global.asax.cs کد زیر را داخل متد Application_Start، در انتهای کدهای نوشته شده قرار دهید:


ModelBinders.Binders.Add(typeof(Models.Person), new Infrastructure.PersonModelBinder());
ModelBinders.Binders.DefaultBinder = ModelBinders.Binders[typeof(Models.Person)];

با تعریف PersonModelBinder و اضافه کردن اون به ModelBinder های برنامه، در صورتی که پارامتر person مربوط به Submit Action مقدار نداشته باشد، از طریق Binder تعریف شده مقدار خواهد گرفت، پس از انجام مراحل بالا و اجرای برنامه، در صورتی که روی دکمه Submit کلیک کنیم، خواهیم دید که پارامتر person در Submit Action مقدار دارد. یکی از نکاتی که باید به آن توجه کرد این است که input text های که داخل تگ form در Index View تعریف شده اند، پس از post، داخل دیکشنری HttpContext.Request.Form قرار می گیرند که می توان به راحتی از داخل Binder به آنها دسترسی داشت.
موفق و پیروز باشید...