這個是網友在官網論壇的提問:https://fineui.com/bbs/forum.php?mod=viewthread&tid=22237php
本着務實求真的態度,咱們先來複現這個問題。首先頁面截圖是這樣的:mvc
類 MsStudentMajor 有兩個非空屬性 Major2 和 Desc2,以下所示:框架
public class MsStudentMajor { /// <summary> /// 標識 /// </summary> public int Id { get; set; } /// <summary> /// Name /// </summary> public string Name { get; set; } /// <summary> /// 所學專業 /// </summary> [Required] public string Major2 { get; set; } [Required] public string Desc2 { get; set; } }
可是頁面上只用到了 Major2,而沒有用到 Desc2:測試
F.SimpleForm() .ID("SimpleForm1") .ShowBorder(false) .ShowHeader(false) .BodyPadding(10) .LabelWidth(180) .Items( F.TextBoxFor(m => m.Name) .Label("姓名"), F.HiddenFieldFor(m => m.Major) .Label("所學專業1"), F.DropDownListFor(m => m.StudentMajor.Major2) .ID("StudentMajor_Major2") //.Name("StudentMajor.Major2") .Label("所學專業2") .Items( F.ListItem() .Text("請選擇") .Value(""), F.ListItem() .Text("計算機") .Value("計算機"), F.ListItem() .Text("物理") .Value("物理") ) .SelectedValue(Model.StudentMajor.Major2) //F.TextBoxFor(m => m.StudentMajor.Desc2) // .Label("描述") )
因此在後臺的模型綁定驗證時出錯:ui
[HttpPost] [ValidateAntiForgeryToken] public ActionResult FormSubmit_btnSave_Click(MsStudent model) { if (ModelState.IsValid) { } return UIHelper.Result(); }
遇到問題首先要調試,看下內部變量是否和預想的有出入。首先看下點擊保存按鈕時客戶端提交的數據:spa
二級屬性是以 StudentMajor.Major2 的形式提交的,後臺接受到的數據:
3d
一切都合情合理,二級屬性也能正確綁定,只不過因爲前臺並未告知 StudentMajor.Desc2 的值,因此未能綁定,這也在情理之中。調試
因爲網友在帖子裏提到了老版本 FineUIMvc v5.3.0 是能夠正常運行的,因此咱們找來了老版本,一樣測試以下:code
和最新版不一樣的是,這裏提交的二級屬性名爲 StudentMajor_Major2 ,很明顯,後臺模型綁定時不會自動識別這個字符串:orm
因此這裏,模型綁定出來的 StudentMajor == null。天然而然,就不會提示模型綁定失敗,由於未對二級屬性進行有效的綁定處理!
很明顯,這個應該是老版本的BUG。若是咱們仔細看更新記錄的話,可能看到相關的改進:https://fineui.com/mvc/version/
既然這是老版本的BUG,而新版本沒有問題。那該如何知足用戶的這個需求呢?
其實很簡單,ASP.NET MVC/Core提供了一種機制,能夠在模型綁定時排除對某些屬性的綁定,以下所示:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult FormSubmit_btnSave_Click([Bind(Exclude = "StudentMajor")]MsStudent model) { if (ModelState.IsValid) { } return UIHelper.Result(); }
注意,這裏的 [Bind(Exclude = "StudentMajor")] 就是告訴ASP.NET MVC/Core 框架在模型綁定時忽略 StudentMajor 屬性。
萬事皆有因,萬般皆有果。