使用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://codetunnel.io/aspnet-mvc-model-binding-security/
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。