asp.net mvc Model Binder

1、按照如下顺序查找绑定到Model 上的值:

  • Request.Form
  • RouteData.Values
  • Request.QueryString
  • Request.Files

2 调用 Model Binding 方式

2.1 自动调用

public ActionResult DisplayAddress(Address address) {
    return View(address);
}

2.2 手动调用

public ActionResult DisplayAddress() {
   IList<Address> addresses = new List<Address>();
   UpdateModel(addresses);//使用UpdateModel手动调用,如果绑定出错报异常
   TryUpdateModel(addresses);//使用TryUpdateModel手动调用,如果绑定出错不报异常
    return View(address);
}

3、作用范围(用Include 举例)

3.1 方法上

public ActionResult DisplayAddress([Bind(Include = "Country")]Address address) {
    return View(address);
}

3.2应用程序上

    //Model Address
    [Bind(Include = "Country")]
    public class Address {
          public string City { get; set; }
          public string Country { get; set; }
    }

4、绑定不包含某属性

//
public ActionResult DisplayAddress([Bind(Exclude = "Country")]Address address) {
    return View(address);
}

5、绑定固定属性

public ActionResult DisplayAddress([Bind(Include = "Country")]Address address) {
    return View(address);
}

7、添加前缀

//
public ActionResult DisplayAddress([Bind(Prefix="HomeAddress")]Address address) {
    return View(address);
}

8、自定义 Model Binder

8.1 定义

//实现IModelBinder
public class AddressBinder : IModelBinder {
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
        Address model = (Address)bindingContext.Model ?? new Address();
        model.City = GetValue(bindingContext, "City");
        model.Country = GetValue(bindingContext, "Country");
        return model;
    }

    private string GetValue(ModelBindingContext context, string name) {
        name = (context.ModelName == "" ? "" : context.ModelName + ".") + name;
        ValueProviderResult result = context.ValueProvider.GetValue(name);
        if (result == null || result.AttemptedValue == "") 
            return "<Not Specified>";
        else 
            return (string)result.AttemptedValue;
    }
}

8.2 注册

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    ModelBinders.Binders.Add(typeof(Address), new AddressBinder());
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容