Как создать 'n' дочерние объекты и родительские объекты в одном представлении? - PullRequest
1 голос
/ 03 апреля 2019

Я использую asp.net mvc razor и создаю представление для создания родительского объекта, но наряду с созданием родительского объекта мне нужно создать 'n' дочерних объектов.Как я могу сделать это точно?

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

Позвольте мне объяснить, что именно мне нужно сделать:

У меня есть модель с именем 'Car' , эта модель имеет дочерний элемент: ICollection , когда пользователь вставит новую 'Car' , он может быть способен вставить 'Extra' вещи перед тем, как вставить 'Car' в базу данных .И «Extra» может иметь N элементов, поэтому он не исправлен.

Моя модель в качестве примера:

    [Table("Car")]
    public partial class Car
    {
        [Key]
        public int IdCar { get; set; }

        [Required]
        [StringLength(10)]
        [Display(Name = "Car")]
        public string DsCar { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Extra> Extra{ get; set; }
}

Вот пример представления того, что я хочусделать это могло бы помочь: Вставить страницу

Я бы хотел избежать эффекта обновления страницы, если это возможно.

1 Ответ

0 голосов
/ 09 апреля 2019

После некоторых исследований я не нашел ничего подходящего для своего случая, поэтому я закончил делать некоторый код самостоятельно.(Я не мог искать много, я думаю, что где-то должен быть лучший ответ)

Поскольку я хочу сделать их многоразовыми, я создал их в частичном представлении .

<div class="form-group">
    @{
        TempData["ParentToken"] = ViewBag.Token;
        Html.RenderAction("EstoqueOpcional", "Estoques");
    }
</div>

В своем частичном представлении я создал AjaxForms :

@using (Ajax.BeginForm("EstoqueOpcionalCreate", new AjaxOptions() { OnSuccess = "RegistroAdicionadoOpcional()", OnFailure = "ConectionFailed()", HttpMethod = "Post" })){
    @Html.Hidden("PageToken", (object)TempData["ParentToken"])
<!-- MY FIELDS -->
<input type="submit" value="Atualizar" class="btn btn-save" />
...

У меня есть маркер страницы на каждой странице, поэтому я могу создавать TempDatas, используя их без проблем пользователяоткрытие нескольких вкладок одного и того же представления.(ViewBag недоступен, потому что я не могу отправить что-либо обратно на страницу).

Это скрипты, которые я создал для управления дисплеем и прочим.(Большинство из них все еще строго типизированы, поскольку я еще не уточнил свой код)

<script>
function RegistroAdicionadoOpcional() {
    var newData = $("#dsopcional").val();

    var pass = true;
    $("#tableEstoqueOpcional .CheckData").each(function () {
        if ($(this).html() == newData)
            pass = false;
    });

    if (pass) {
        $("#tableEstoqueOpcional").append("<tr><td class=\"CheckData\">" + newData + "</td>" +
            "<td class=\"grid-cell temp-cell\" style=\"padding: 0px !important;\">" + "<a href=\"#\" onclick=\"return RemoveDataOpcional('" + newData + "');\">Remover</a>" + "</td></tr>");
        $("#dsopcional").val("");
        $("#dsopcional").focus();
    }
    else {
        Message("Error", "Esse valor já foi inserido.");
        $("#dsopcional").focus();
    }
}

function RemoveDataOpcional(value) {

    $.ajax({
        url: "/Estoques/RemoverOpcional",
        data: { opcional: value, PageToken: $("#PageToken").val() },
        cache: false,
        type: "POST",
        timeout: 5000,
        success: function (data) {
            if (data == "True") {
                $("#tableEstoqueOpcional .CheckData").each(function () {
                    if ($(this).html() == value)
                        $(this).parent('tr').remove();
                });
            }
            else
                Message("Error", "Não foi possível remover o valor escolhido, tente atualizar a página.");
        },
        error: function (reponse) {
            Message("Error", "Não foi possível remover o valor selecionado, se o erro persistir tente recarregar a página.");
        }
    });

}

@{
    var regs = "";
    if (TempData["EstoqueOpcional"] != null)
    {
        foreach (var item in (List<Models.EstoqueOpcional>)TempData["EstoqueOpcional"])
        {
            regs += "<tr><td class=\\\"CheckData\\\">" + item.DsOpcional + "</td>" +
                "<td class=\\\"grid-cell temp-cell\\\" style=\\\"padding: 0px !important;\\\">" + "<a href=\\\"#\\\" onclick=\\\"return RemoveDataOpcional('" + item.DsOpcional + "');\\\">Remover</a>" + "</td></tr>";
        }
    }
    TempData["DisplayEstoque"] = regs;
}

$(document).ready(function () {
    var text = "@Html.Raw(HttpUtility.HtmlDecode(TempData["DisplayEstoque"].ToString()))";
    $("#tableEstoqueOpcional").append(text);
});

В моем контроллере я создал эти методы для управления значениями в TempData:

    public ActionResult EstoqueOpcional()
    {
        return PartialView(new EstoqueOpcional());
    }

    [HttpPost]
    public bool EstoqueOpcionalCreate(EstoqueOpcional estoqueOpcional, string PageToken)
    {
        List<EstoqueOpcional> estoqueOpcionals = new List<EstoqueOpcional>();

        if (TempData["EstoqueOpcional" + PageToken] != null)
            estoqueOpcionals.AddRange((List<EstoqueOpcional>)TempData["EstoqueOpcional" + PageToken]);

        if (estoqueOpcionals.Where(x => x.DsOpcional == estoqueOpcional.DsOpcional).Count() == 0)
            estoqueOpcionals.Add(estoqueOpcional);

        TempData["EstoqueOpcional" + PageToken] = estoqueOpcionals;

        return true;
    }

    public bool RemoverOpcional(string opcional, string PageToken)
    {
        try
        {
            if (TempData["EstoqueOpcional" + PageToken] != null)
            {
                List<EstoqueOpcional> estoqueOpcionals = (List<EstoqueOpcional>)TempData["EstoqueOpcional" + PageToken];
                estoqueOpcionals.RemoveAll(x => x.DsOpcional == opcional);
                TempData["EstoqueOpcional" + PageToken] = estoqueOpcionals;
            }

            return true;
        }
        catch
        {
            return false;
        }
    }

В кнопке «Обновить» моей основной модели я сделал следующее:

            List<EstoqueOpcional> estoqueOpcionals = new List<EstoqueOpcional>();

            if (TempData["EstoqueOpcional" + PageToken] != null)
                estoqueOpcionals.AddRange((List<EstoqueOpcional>)TempData["EstoqueOpcional" + PageToken]);

            foreach (var estoqueopcional in estoqueOpcionals)
            {
                estoqueopcional.CdEstoque = estoque.CdEstoque;
                EstoqueOpcional estoqueopcionaltemp = db.EstoqueOpcional.Where(x => x.DsOpcional == estoqueopcional.DsOpcional).FirstOrDefault();

                if (estoqueopcionaltemp == null)
                    db.EstoqueOpcional.Add(estoqueopcional);
            }

            foreach (var item in db.EstoqueOpcional.Where(x => x.CdEstoque == estoque.CdEstoque).ToList()
                .Where(x => !estoqueOpcionals.Any(y => y.DsOpcional == x.DsOpcional)).ToList())
            {
                db.EstoqueOpcional.Remove(item);
            }

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

Результат изображения

Любые советы или предложения приветствуются.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...