MVC 模型繫結

2021-09-08 11:23:41 字數 3336 閱讀 4317

在webform,獲取提交表單的值一般都是request.form["title"]這樣的方式。在mvc中,提供了模型繫結機制。讓後台獲取表單或url中的引數變得更加簡單。

你可以直接在引數中用字串,整型變數,實體或者是list《實體》的方式獲取表單提交的引數。

引數中的這些東西都是與表單中的html控制項的name屬性一一對應的。

public actionresult personadd(int id)

例如以上**,它能夠匹配url中的id引數。如以下兩種方法id都能夠匹配到1

在例如如下**:

public actionresult personadd(string name)

它能夠匹配到表單中提交的張三:

也能夠匹配到get請求的路徑引數:

http://localhost/home/personadd?name=張三
如果是用實體,則會檢查該實體的屬性名與表單中name屬性中對應的標籤的值。

例如有如下實體:

public class person_model

public string name

}

在controller中的引數填寫如下:

}這樣的話,模型繫結器會自動檢查該實體的屬性與name一一對應的標籤並繫結。如下表單的值將被繫結到model實體的屬性中。

updatemodel與tryupdatemodel都用於顯示模型繫結。如果繫結期間出現錯誤或者模型是無效的。

updatemodel將丟擲乙個異常。因此updatemodel要用try catch語句塊包起來,而tryupdatemodel不會丟擲異常,而是返回乙個布林型別的值,true表示繫結成功,false表示繫結失敗。如:

}另外,模型繫結還有乙個模型狀態,模型繫結器一斤模型中的每乙個值在模型狀態中都有相應的一條記錄。可以隨時檢視繫結狀態。如:

}假設有如下實體:

public class comment

public string name

public string content

//是否已審核

}

在controller中:

public actionresult commentadd(comment com)

else

}

白名單:

[bind(include="name,content")]      //白名單,只繫結這兩個屬性

bind特性可以應用於引數左側也可以應用於實體model類的頂部,應用於實體modle的頂部則是對所有該實體繫結有效,而應用於引數左側則只是對該action中的請求有效。

如:

else

}

另外,updatemodel與tryupdatemodel也有乙個過載版本來接收乙個繫結列表:

updatemodel(com, "", new string );
最後,還有一種就是檢視模型,即另外在定義乙個模型來專供檢視使用,僅僅包括需要繫結的屬性。

另外,如果兩個類有相同的name屬性,要同時繫結,區分html可以這樣寫:

客戶名稱: 

銷售員名稱:

在asp.net mvc中,使用者請求道伺服器的資料將被包裝為model資料物件,這個資料物件通常也被view用來提供顯示的資料。在asp.net mvc中,提供了非常靈活的model繫結機制,通過imodelbinder藉口,定義了繫結model資料的約定,並提供了乙個介面的預設實現defaultmodelbinder。在大多數情況下,僅僅通過defaultmodelbinder就可以完成model的繫結。

如果需要的話,也可以自定義乙個imodelbinder的實現,完成特定型別的model繫結。

public inte***ce imodelbinder

1、繫結model

預設情況下,asp.net mvc使用defaultmodelbinder來繫結model的資料。在傳遞action引數的時候,asp.net mvc按照如下順序查詢匹配的資料:

form表單中的資料;

routedata中的資料;

querystring中的資料;

2、簡單引數和複雜引數

如果action方法的引數型別是值型別和字串型別,那麼defaultmodelbinder將尋找與action引數名稱匹配的引數,如果沒有對應的引數,那麼action的引數將試圖賦予空引用。因此,對於簡單型別的引數來說,引數的型別應該是可空的。

多數情況下,我們會通過乙個model物件來處理複雜的引數,defaultmodelbinder會遍歷model物件的屬性來繫結引數。

如果不希望defaultmodelbinder對某個引數進行繫結,可以通過bindattribute進行說明,其中定義了三個屬性:

這些標籤可以定義在model上,說明在引數繫結過程中需要繫結的屬性或者不需要繫結的屬性,如:

[bind(include = "name,birthday")]

public class person

public string name

public datetime birthday

}

在updatemodel方法中,指定包含的屬性和不包含的屬性。

updatemodel(

person, //model

"person", //prefix

new ,  //include

new    //exclude

);

MVC模型繫結

一 理解模型繫結 模型繫結是http請求與c 方法之間的乙個橋梁,它根據 action 方法中的 model 型別建立 net 物件,並將 http 請求資料經過轉換賦給該物件。二 預設的模型繫結器 應用程式有多個繫結器,大多數的都是依賴與內建繫結器類 defaultmodelbinder,一般情況...

MVC4之ModelBinder 模型繫結

最近悟出來乙個道理,在這兒分享給大家 學歷代表你的過去,能力代表你的現在,學習代表你的將來。十年河東十年河西,莫欺少年窮 學無止境,精益求精 最近在做自學mvc,遇到的問題很多,索性一點點總結下。mvc modelbinder是mvc模型繫結的核心,本節以簡單示例講解mvc模型繫結,涉及到基本型別繫...

MVC 自定義模型繫結器,從表單對模型進行賦值

一 奇葩的問題 之前自己造輪子的時候,遇到乙個很奇怪的問題,雖然需求很奇葩,但是還是嘗試解決了一下 當提交的表單裡包含多個重複名稱的字段的時候,例如 html 如果需要模型在action進行接收,那麼通常的解決方案是用乙個 ienumerable 型別或其派生型別來接收資料,以保證資料的完成性,例如...