簡體   English   中英

我的Razor模型在Post上為空

[英]My Razor model is null on Post

我使用以下類型來擴展在整個系統中使用的另一種類型:

    public class SystemUser : User
    {
        public int? RoleId
        {
            get { return this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id();}
            set { RoleId = value; }
        }

        public Role _Role
        {
            get { return (Role)RoleId; }
            set { RoleId = (int)value; }
        }

        public SelectListItem[] RolesList { get; set; }

        public bool IsA(params Role[] roles)
        {
            return new List<Role>(roles).Any(v => v.Equals(_Role));
        }

        public bool IsNotA(params Role[] roles)
        {
            return !(new List<Role>(roles).Any(v => v.Equals(_Role)));
        }
    }

我本質上是在使用此Type充當數據庫中數據的容器,並將其作為@model從控制器傳遞到我們的視圖。 可以很好地填充“視圖”視圖,但是在我使用@ Html.LabelFor()字段修改了模型並將數據傳遞到用於將更新后的數據保存到數據庫的控制器后,該模型為空。 如果我逐步執行POST,則會在SystemUser類中的ROleId的getter上收到NullReferenceException。 注意_Role屬性; 眾所周知,如果類的屬性與其類型具有相同的名稱,則模型會將空值發布到控制器,但是我已經修復了該問題。

這是視圖的實質:

@model SystemUser
@using (Html.BeginForm("Usr", "Mr", FormMethod.Post, new {@autocomplete="off"}))
    {
        //Fields removed for sake of simplifying stackoverflow post

        <input class="button green-bg" type="submit" value="Save" />
        <input class="button gray-bg" type="button" onclick="location.href='@Url.Action("View", "Mr")'" value="Cancel" />
    }

在這里的任何幫助將不勝感激。

在控制器中填充模型以創建視圖時,您將獲得一個EF模型(通過代碼外觀), 其中包括子關系

該視圖將僅回發與頁面上命名輸入元素匹配的屬性。

由於Relationhip是服務器端集合,因此該屬性在post操作中將為null post操作收到該類的簡單版本(未填充外鍵關系)。

如果需要,則需要在控制器內部重新填充該屬性(例如,基於回發的ID值)。

如果您也顯示了控制器代碼和基本的User類,那么我可能會建議采取一些具體的措施來解決此問題:)

解決方法:

確保getter屬性測試是否存在該集合:

    public int? RoleId
    {
        get { return this.Relationhip == null ? null : this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id();}
        set { RoleId = value; }
    }

額外:

我也有點擔心,因為沒有字段支持RoleId屬性,所以set { RoleId = value; } set { RoleId = value; }實際上是一個遞歸調用。 您可能要檢查一下。

因為它是一個派生屬性,所以我希望它看起來像這樣(無設置器):

    public int? RoleId
    {
        get { return this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id();}
    }

或者,如果它充當數據庫的緩存本地值,則添加一個私有字段來支持該屬性,方法是:

    private int? roleId;
    public int? RoleId
    {
        get 
        { 
             return (roleId = roleId.GetValueOrDefault(this.Relationhip == null ? null : this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id()));
        }
        set { roleId = value; }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM