ASP. NET MVC 5 Отправка вложенных моделей обратно в контроллер является пустой или пустые модели - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь вернуть вложенные данные обратно на мой контроллер, и в зависимости от решений, которые я пробовал, я получаю либо нулевые, либо полностью пустые модели.

Модели, отправленные для просмотра, имеют значения данных, например, Description = "Some Description" на контроллере, если модель не равна нулю, то Description = null.

Я пробовал с различными предложениями, [Здесь] (. NET Core / MVC - Просмотреть проводку нулевой модели обратно в контроллер ), [Здесь] (https://askguanyu.wordpress.com/2017/05/11/asp-net-mvc-post-to-controller-with-nested-class-collection-null-issue-and-how-to-fix/) и [здесь] (MVC Модель потомка объект null в сообщении HTTP ), чтобы назвать несколько.

Мои классы моделей:

public class AdminAccountInfo
{
    public UserProfile UserProfileInfo { get; set; }
    public ContactsFormModel ContactsFormModel { get; set; }
    public List<WebPageModel> WebElement { get; set; }
}

public class WebPageModel
{
    public string PageName { get; set; }
    public string Description { get; set; }
    public int WebPageId { get; set; }

    public Boolean RoleLevel { get; set; }
    public Boolean AreaLevel { get; set; }
    public Boolean CountryLevel { get; set; }
    public Boolean OperatorLevel { get; set; }
    public Boolean AdvertLevel { get; set; }
    public Boolean visible { get; set; }

    public List<WebPageElementModel> ElementViewDatas { get; set; }

}

public class WebPageElementModel
{
    public int PageElementId { get; set; }
    public string ActionName { get; set; }
    public string Description { get; set; }
    public bool visible { get; set; }
    public bool enabled { get; set; }
}

Мой контроллер

public ActionResult Index() // Cut down for brevity
{
    AdminAccountInfo _accountInfo = new AdminAccountInfo();
    List<WebPageModel> pages = new List<WebPageModel>();
    pages = GetData(); // Cut down for brevity 

    _accountInfo.WebElement = pages;
    _accountInfo.ContactsFormModel = contactsmodel;
    _accountInfo.UserProfileInfo = _profile;

    return View(_accountInfo);
}

public ActionResult SaveWebPageInfo(List<WebPageModel> pageElement)

// Также попытались: publi c ActionResult SaveWebPageInfo ([Bind (Prefix = "WebElement")] List webElement) {ModelState.DumpErrors ();

    if (ModelState.IsValid)
    {
        var testing = webElement;

        if(success)
           SAY WOW!
    }
}

Я использовал этот пост как с обычной моделью, так и с тем, что я думал Возможно, это была Модель с привязкой.

Индекс:

// Cut down for brevity 
@using ad_admin.ViewModels;
@model AdminAccountInfo

@{
    ViewBag.Title = "User Profile";
    //Layout = "~/Shared/_Layout.cshtml";
}

    <div class="row">
        @Html.Partial("_UserInfo", Model.UserProfileInfo)

    </div>
    <div class="row">
                @Html.Partial("_ContactInfo", Model.ContactsFormModel)
     </div>

    <div class="row">

        @Html.Partial("_PagesHolder", Model.WebElement)
    </div>
</div>

Для PagesHolder Я попытался вызвать EditorTemplates как напрямую @Html.EditorFor(x => Model), так и с для l oop @for (int i = 0; i < Model.Count(); i++)

Редактор шаблонов

// Editor page
// Cut down for brevity
WebPageModel.cshtml

@model WebPageModel
<div class="card">
    <div class="card-header">
        <h2 class="mb-0">
            <button type="button" class="btn btn-link" data-toggle="collapse" data-target="#@Model.PageName"><span class="alignleft bold">Name:</span><span class="alignleft"> @Model.PageName</span><span class="text-align-center bold">Description:</span><span class="text-align-center"> @Model.Description</span></button>
        </h2>
    </div>
    <div id=@Model.PageName class="collapse" aria-labelledby="headingOne" data-parent="#myAccordion">
        <div class="card-body">
            <div class="form-group row">
                <label class="col-lg-2 control-label">Country Level</label>

                <div class="col-lg-3">
                    @Html.CheckBox("Country", Model.CountryLevel)
                </div>
            </div>
            @Html.EditorFor(x => Model.ElementViewDatas)
// I have also tried the below
        @*for (int i = 0; i < Model.Model.ElementViewDatas.Count(); i++)
            {
                @Html.EditorFor(x => Model.ElementViewDatas[i])
            }*@

</div> and some more </div>

// Editor page
// Cut down for brevity
WebPageElementModel.cshtml
@model  WebPageElementModel

<div class="form-group row">
    @Html.Hidden(Model.PageElementPermissionId.ToString())
    <label class="control-label font15 bold"><span class="bold">Element Name:   </span></label> @Html.Label(Model.ActionName, new { @class = "control-label" })
    <label class="control-label"><span class="col-lg-1"></span>Description:   </label> @Html.Label(Model.Description, new { @class = "control-label" })
    <label class="control-label"><span class="col-lg-1"></span>Is Visible: @Html.CheckBox("Is Visible", Model.visible)</label>
    <label class="control-label"><span class="col-lg-1"></span>Is Enabled: @Html.CheckBox("Is Enabled", Model.enabled)</label>
</div>

Любая помощь будет принята с благодарностью.

...