ASP.NET MVC/Core表單提交後臺模型二級屬性驗證問題

原由

這個是網友在官網論壇的提問: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

因爲網友在帖子裏提到了老版本 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 屬性。

 

萬事皆有因,萬般皆有果。

相關文章
相關標籤/搜索