[MVC]Model Binding with Interface

使用Interface做Model Binding

前言

為了避免Over Posting,MVC預設有提供我們白名單和黑名單弱型別的過濾方式 [Bind(Include = "FieldName")][Bind(Exclude= "FieldName")]。  如果要使用強型別過濾我們會建立一個ViewModel負責接Input的參數,這些都是可以避免Over Posting的。  而今天要介紹的是,如何用Interface,又是強型別的方式來過濾欄位。

 

範例說明

首先我們有一個User的Model

public class User
{
    public string Id { get; set; }
    
    public bool IsAdmin { get; set; }

}

我們希望Binding的時候,只Binding到Id這個欄位,此時我們可以建立一個IUser Interface,並讓User實作IUser。

public interface IUser
{
    string Id { get; set; }
}

public class User : IUser
{
    public string Id { get; set; }

    public bool IsAdmin { get; set; }
}

使用UpdateModel或者TryUpdateModel的方式Binding

public ActionResult Index()
{
    var user = new User();
    
    UpdateModel<IUser>(user);
    
    return View(user);
}

這樣就可以過濾IsAdmin不被Binding。

 

小結

這個方式是先有Model之後再有Interface來決定要Binding哪些欄位,跟一般先有Interface再有class順序不太一樣。  

一個class又能實作多個Interface,所以又可以根據不同邏輯,用Interface的方式指定要Binding的欄位,個人覺得這個方式還蠻漂亮的。

 

Note:

使用此方式Binding,Model Validation一樣是加在Model Properties上,不能加在Interface Properties上。

public class User : IUser
{
    [Required]
    public string Id { get; set; }

    public bool IsAdmin { get; set; }
}

 

參考:

http://odetocode.com/blogs/scott/archive/2012/03/11/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx

http://codetunnel.io/aspnet-mvc-model-binding-security/

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。