ASP.Net MVC adicionando elementos editoriais dynamics

Eu tenho um pequeno projeto com um EditorTemplate. Eu mostro alguns itens que estão inicialmente em uma List mas eu quero ser capaz de adicionar itens quando o usuário pressiona um botão.

normalmente eu adiciono os itens ao View como este

 @for (int i = 0; i  model.Models[i], "_AddArticleFullQuantity"); } 

Quando eu quero adicionar itens dinamicamente eu tentei criar um botão que usa ajax para chamar o servidor

  GUIRequests.prototype.AddArtikelToDiv = function () { this.Request.CallAjax("/NewItemDelivery/GetPartialView_AddArticleFullQuantity", "", GUIRequests.AddToView); } GUIRequests.AddToView = function (html) { $("#addedItems").append(html); } 

O botão faz uma chamada ajax para o meu controlador, que fará o seguinte

 public ActionResult GetPartialView_AddArticleFullQuantity() { WrongItemsReceivedModel model = new WrongItemsReceivedModel(); ModelContainer container = (ModelContainer)TempData["ModelContainer"]; container.Add(model); return PartialView("~/views/Shared/EditorTemplates/_AddArticleFullQuantity.cshtml", container.Models[0]); } 

E no final eu recebo o que eu esperava, ele vai me mostrar o meu modelo, mas os itens inicialmente mostrados a partir da lista são numerados

Então normalmente eu tenho elementos como:

  

Mas eu entendo isso:

  

Eu acho que é porque eu adiciono um com o EditorFor “comando”, mas o outro é adicionado como PartialView. Existe alguma maneira como eu posso adicionar um elemento EditorFor para que minha lógica não quebre?

Para editar uma lista de comprimento variável no ASP.NET MVC, eu recomendaria a leitura do following article . Ele apresenta uma abordagem muito limpa para implementar isso. No servidor você não precisará de nenhum TempData para persistência e também ilustra o uso de um pequeno ajudante que lhe permitirá gerar os nomes dos campos de input apropriados.

No que diz respeito à sua pergunta, você está certo de que o motivo pelo qual você obtém nomes de input incorretos é que, quando você retorna a visualização parcial diretamente da ação do controlador, ela não tem mais o contexto pai do Template do Editor. Existem algumas maneiras de contornar isso, mas é muito hacky e eu prefiro recomendar a abordagem apresentada no artigo.

Normalmente eu iria para o post no blog de steven sanderson como Darrin menciona, já que se tornou um dos padrões da indústria. Sim, a visão parcial é uma dor em seu cenário.

Em seu cenário em que você gostaria de manter a lógica do modelo do editor e os elementos adicionados dynamics vinculados, eu iria e geraria o mesmo nome que o editor for requisições conforme abaixo

Este é o meu código apenas para dar o exemplo.

  $("#addItemdynamically").click(function () { $.ajax({ url: '@Url.Action("GetNewGuid", "NewWebForms")', cache: false, success: function (newguid) { id = newguid; var html = '' + '' + '' + '' + '' + ' delete' + '' $("#editorRows tbody").append(html); $("form").removeData("validator"); $("form").removeData("unobtrusiveValidation"); $.validator.unobtrusive.parse("form"); } }); return false; }); 

Basicamente, meu novo guid está recebendo o guid gerado recentemente do lado do servidor e anexando-o à linha que é gerada pressionando o botão add new item.

você pode gerar um dígito int se quiser aqui, mas isso também requer algum outro hack.