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

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

1


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>
}
复制代码

 

提交后结果:

2

posted @   Darren Ji  阅读(993)  评论(0)    收藏  举报
编辑推荐:
· SQL Server 2025 中的改进
· 当数据爆炸遇上SQL Server:优化策略全链路解析
· 记录一次线上问题排查:JDK序列化问题
· 微服务之间有哪些调用方式?
· 记一次SQL隐式转换导致精度丢失问题的排查
阅读排行:
· 一个基于 C# Unity 开发的金庸群侠传 3D 版,直呼牛逼!
· SQL Server 2025 中的改进
· 向商界大佬一样管理技术工作 - 以团队换将+技术重构为例
· 用c#从头写一个AI agent,实现企业内部自然语言数据统计分析(三)--一个综合的例子
· DeepSeek+Coze实战:如何从0到1打造一个热点监控智能体

我的公众号:新语新世界,欢迎关注。

点击右上角即可分享
微信分享提示