MVC扩展ModelBinder,通过继承DefaultModelBinder把表单数据封装成类作为action参数

时间:2024-01-02 10:22:21

把视图省、市、街道表单数据,封装成一个类,作为action参数。如下:

MVC扩展ModelBinder,通过继承DefaultModelBinder把表单数据封装成类作为action参数

action方法参数类型:

namespace MvcApplication1.Models
{
    public class Customer
    {
        public string Address { get; set; }
    }
}

在自定义ModelBinder中,接收视图表单数据,封装成Customer类。

using System.Web;
using System.Web.Mvc;
using MvcApplication1.Models; namespace MvcApplication1.Extension
{
public class CustomerBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof (Customer))
{
HttpRequestBase request = controllerContext.HttpContext.Request;
string province = request.Form.Get("Province");
string city = request.Form.Get("City");
string street = request.Form.Get("street"); return new Customer() {Address = province+city+street};
}
else
{
return base.BindModel(controllerContext, bindingContext);
} }
}
}

全局注册:

ModelBinders.Binders.Add(typeof(Customer), new CustomerBinder());

HomeController:

using System.Web.Mvc;
using MvcApplication1.Extension;
using MvcApplication1.Models; namespace MvcApplication1.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
} [HttpPost]
public ActionResult Index([ModelBinder(typeof(CustomerBinder))]Customer customer)
{
if (ModelState.IsValid)
{
return Content(customer.Address);
}
return View();
}
}
}

Home/Index.cshtml:

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
} <h2>Index</h2>
@using (Html.BeginForm())
{
<table>
<tr>
<td>省</td>
<td><input type="text" id="Province" name="Province"/></td>
</tr>
<tr>
<td>市</td>
<td><input type="text" id="City" name="City"/></td>
</tr>
<tr>
<td>街道</td>
<td><input type="text" id="Street" name="Street"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"/></td>
</tr>
</table>
}

提交后结果:

MVC扩展ModelBinder,通过继承DefaultModelBinder把表单数据封装成类作为action参数