簡體   English   中英

C#MVC從View中獲取模型列表

[英]C# MVC Get List of Models from View

我有一個模型列表,我在表單中的視圖中顯示。 這是有效的,但如果我點擊保存我得到了模型,但列表是空的。 有人有想法嗎?

視圖:

@model AdminFeatureSetsModel

@{
    Layout = "~/Views/Shared/_AdministrationLayout.cshtml";
}

@section headerTitle
{
<div>Edit Feature Settings</div>
<br />
<br />
}

@using (Html.BeginForm("Save", "AdminFeatureSets", FormMethod.Post, new { id = "EditFeatureSet", name = "EditFeatureSet", @class = "form-horizontal" }))
{
    <div class="grey-border-generic" id="EditFeatureSet">
        <div class="col-sm-2">
            <b> Feature Name</b>
        </div>
        <div class="col-sm-2">
            <b> Enabled</b>
        </div>
        <div class="col-sm-2">
            <b> Verify</b>
        </div>
        <div class="col-sm-2">
            <b> Enabled By User</b>
        </div>
        <div class="col-sm-2">
            <b>Enabled By Organization </b>
        </div>
        <br />
        <br />
        @for (int i = 0; i < Model.FeatureSets.Count; i++)
        {

            if (Model.FeatureSets[i].IsFeatureInDB == true)
            {
                <div class="col-sm-2">
                    <b> @Model.FeatureSets[i].Name</b>
                </div>
                <div class="col-sm-2">
                    @Html.TextBoxFor(m => Model.FeatureSets[i].Enabled, new { @class = "form-control", @id = "EditEnable" })
                </div>
                <div class="col-sm-2">
                    @Html.TextBoxFor(m => Model.FeatureSets[i].Verify, new { @class = "form-control", @id = "EditVerify" })
                </div>
                <div class="col-sm-2">
                    @Html.TextBoxFor(m => Model.FeatureSets[i].EnabledByUser, new { @class = "form-control", @id = "EditEnableByUser" })
                </div>
                <div class="col-sm-2">
                    @Html.TextBoxFor(m => Model.FeatureSets[i].EnabledByOrganisation, new { @class = "form-control", @id = "EditEnableByOrganization" })
                </div>
                <br />
                <br />
            }
            else
            {
                <div class="col-sm-2">
                    <b> @Model.FeatureSets[i].Name</b>
                </div>
                <div class="col-sm-2" style="color:red">
                    <b> Not in database</b>
                </div>
                <br />
                <br />
            }


        }

                <button class="btn btn-xyzmo-secondary " id="saveEditsBtn">Save</button>
    </div>
}

控制器:在foreach(model.FeatureSets)保存的函數中,FeatureSets(List)始終為空。

public ActionResult Index()
        {
            AdminFeatureSetsModel modelFeatureSets = new AdminFeatureSetsModel();
            modelFeatureSets.FeatureSets = new List<FeatureSetModel>();
            var featureInDB = DbContext.GetAllEntitiesQueryable<Feature>();

            var clazz = typeof(FeatureSet);
            foreach (var property in clazz.GetProperties())
            {
                FeatureSetModel modelFeatureSet = new FeatureSetModel();
                var feature = featureInDB.FirstOrDefault(f => f.Name == property.Name);
                if (feature != null)
                {
                    modelFeatureSet.Name = feature.Name;
                    modelFeatureSet.Enabled = feature.Enabled;
                    modelFeatureSet.Verify = feature.Verify;
                    modelFeatureSet.EnabledByUser = feature.EnableByUser;
                    modelFeatureSet.EnabledByOrganisation = feature.EnableByOrganization;
                    modelFeatureSet.IsFeatureInDB = true;
                }else
                {
                    modelFeatureSet.Name = property.Name;
                    modelFeatureSet.IsFeatureInDB = false;
                }
                modelFeatureSets.FeatureSets.Add(modelFeatureSet);             

            }
            return View(modelFeatureSets);   
        }

        public ActionResult Save(AdminFeatureSetsModel model)
        {

            var featureInDB = DbContext.GetAllEntitiesQueryable<Feature>();
            foreach (var featureSet in model.FeatureSets) // here the FeatureSet of the model is always empty
            {
                if (featureSet.IsFeatureInDB == true)
                {
                    var feature = featureInDB.FirstOrDefault(f => f.Name == featureSet.Name);
                    feature.Enabled = featureSet.Enabled;
                    feature.Verify = featureSet.Verify;
                    feature.EnableByUser = featureSet.EnabledByUser;
                    feature.EnableByOrganization = featureSet.EnabledByOrganisation;
                }
            }
            DbContext.SaveChanges();
            return RedirectToAction("Index", "AdminFeatureSet");
        }

帶列表的模型:

public class AdminFeatureSetsModel :AdminBaseModel
    {
        public List<FeatureSetModel> FeatureSets { get; set; }    
    }

模型FeatureSet:

public class FeatureSetModel : AdminBaseModel
    {
        public string Name { get; set; }

        public bool Enabled { get; set; }
        public bool Verify { get; set; }
        public bool EnabledByUser { get; set; }
        public bool EnabledByOrganisation { get; set; }

        public bool IsFeatureInDB { get; set; }

        public List<User> EnabledUserList { get;set;}
        public List<Organization> EnabledOrginaizationList { get; set; }

    }

FeatureSetModels的視圖


編輯

     @Html.HiddenFor(m => m.FeatureSets[i].IsFeatureInDB)
                if (Model.FeatureSets[i].IsFeatureInDB == true)
                {
                    @*<input type="hidden" name="FeatureSets.Index" value="@i" />*@ 
                    <div class="col-sm-2">
                        <b> @Model.FeatureSets[i].Name</b>
                    </div>
                    <div class="col-sm-2">
                        @Html.CheckBoxFor(m => Model.FeatureSets[i].Enabled)
                    </div>
                    <div class="col-sm-2">
                        @Html.CheckBoxFor(m => Model.FeatureSets[i].Verify)
                    </div>
                    <div class="col-sm-2">
                        @Html.CheckBoxFor(m => Model.FeatureSets[i].EnabledByUser)
                    </div>
                    <div class="col-sm-2">
                        @Html.CheckBoxFor(m => Model.FeatureSets[i].EnabledByOrganisation)
                    </div>
                    <br />
                    <br />
                }
                else
                {
                    @Model.FeatureSets[i].Name
                    @Html.HiddenFor(m => m.FeatureSets[i].Enabled)
                    @Html.HiddenFor(m => m.FeatureSets[i].Verify)
                    @Html.HiddenFor(m => m.FeatureSets[i].EnabledByUser)
                    @Html.HiddenFor(m => m.FeatureSets[i].EnabledByOrganisation)
}

它沒有約束力的原因是因為你的

if (Model.FeatureSets[i].IsFeatureInDB == true)

碼。 如果值為false,則不為該FeatureSetModel生成任何表單控件,因此您回發非連續索引對象。

默認情況下, DefaultModelBinder要求集合索引器從零開始並且是連續的。 如果集合中的第1項具有IsFeatureInDB = false則集合將為空。 (如果前2項是true而第3項是false ,那么你只能獲得2個項目)

解決此問題的一種方法是在else塊內為FeatureSetModel每個屬性添加隱藏輸入。

@for (int i = 0; i < Model.FeatureSets.Count; i++)
{
    @Html.HiddenFor(m => m[i].IsFeatureInDB ) // add this so its value posts back
    if (Model.FeatureSets[i].IsFeatureInDB == true)
    {
        @Model.FeatureSets[i].Name
        @Html.TextBoxFor(m => m[i].Enabled, new { @class = "form-control" }) // remove id attribute
        ....
    }
    else
    {
        @Model.FeatureSets[i].Name</b>
        @Html.HiddenFor(m => m[i].Enabled) // add hidden inputs
        ....
    }

另一種選擇,如果您不希望在提交時包含IsFeatureInDB = false的對象包含在集合中,則包含集合索引器的隱藏輸入,這允許綁定非零/非連續索引器

if (Model.FeatureSets[i].IsFeatureInDB == true)
{
    <input type="hidden" name="FeatureSets.Index" value="@i" /> // add this
    <div class="col-sm-2">
        <b> @Model.FeatureSets[i].Name</b>
    </div>
    <div class="col-sm-2">
        @Html.TextBoxFor(m => Model.FeatureSets[i].Enabled, new { @class = "form-control" }) // remove the invalid id attributes
    </div>

另請注意,您需要為IsFeatureInDB屬性包含隱藏的輸入。 沒有它,POST屬性中該屬性的值將始終為false ,並且不會執行循環中的代碼

附注:從幫助者中刪除new { @id = "xxx"代碼。 重復的id屬性是無效的html。

暫無
暫無

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

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