2015-12-03 4 views
-1

enter image description hereASP.NET MVC: Как вставить несколько «EditorFor» в базу данных?

Если я нажму на «+», появится новое текстовое поле с «x». Если я нажму «x», эта строка синонимов будет удалена. Моя проблема пока заключается в том, как сохранить все эти синонимы в базе данных. Таким образом, база данных должна выглядеть так:

SynonymID Synonym CAS No. 
    1  Synonym1  1 
    2  Synonym2  1 
    3  Synonym3  1 

Теперь он сохраняет только первый. Из этого примера http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/. Это позволило мне использовать «BeginCollectionItem», но он говорит, что моя модель не содержит определения «BeginCollectionItem».

Может ли кто-нибудь помочь мне решить эту проблему? Или есть другой способ сделать это?

Это химический контроллер:

public ActionResult Create() 
    { 
     return View(); 
    } 
    [HttpPost] 
    public ActionResult Create(NPG_ChemicalViewModel model) 
    { 
     using (var context = new NPG_Model()) 
     { 
      var chemical = new NPG_Chemical(); 

      chemical.CAS_Number = model.NPG_Chemical.CAS_Number; 
      context.NPG_Chemical.Add(chemical); 
      context.SaveChanges(); 

      var synonym = new NPG_Chemical_Synonym(); 
      synonym.Synonym = model.NPG_Chemical_Synonym.Synonym; 
      context.NPG_Chemical_Synonym.Add(synonym); 
      context.SaveChanges(); 

      var initialData = new[] { 
      new NPG_Chemical_Synonym { Synonym = "" }, 
      }; 
     } 
    return View(); 
    } 

    public ViewResult BlankEditorRow() 
    { 
     return View("GiftEditorRow", new NPG_ChemicalViewModel()); 
    } 

Это create.cshtml:

@using (Html.BeginForm()) 
{ 
@Html.AntiForgeryToken() 

<div class="form-horizontal"> 
    <h4 align="center">Add Chemical</h4> 
    <hr /> 
    <table style="width:100%;"> 
     <tr> 
      <td>Synonym</td> 
      <td> 
       <div id="editorRows"> 
         @{Html.RenderPartial("GiftEditorRow");} 
       </div> 
       <div> 
        @Html.ActionLink("+", "BlankEditorRow", null, new { id = "addItem" }) 
       </div> 
      </td> 
     </tr> 
     <tr> 
     <tr> 
      <td>CAS No.</td> 
      <td> 
       <div> 
        @Html.EditorFor(model => model.NPG_Chemical.CAS_Number, new { htmlAttributes = new { @class = "form-control" } }) 
        @Html.ValidationMessageFor(model => model.NPG_Chemical.CAS_Number, "", new { @class = "text-danger" }) 
       </div> 
      </td> 
     </tr> 
    </table> 
    <script> 
     $("#addItem").click(function() { 
      $.ajax({ 
       url: this.href, 
       cache: false, 
       success: function (html) { $("#editorRows").append(html); } 
      }); 
      return false; 
     }); 
     </script> 
</div> 
<div class="form-group"> 
    <div class="col-md-offset-3 col-md-9"> 
     <input type="submit" value="Submit" class="btn btn-default" /> 
    </div> 
</div> 
} 

и это BlankEditorRow.cshtml:

<div class="editorRow"> 
<a href="#" class="deleteRow">x</a> 
@Html.EditorFor(x => x.NPG_Chemical_Synonym.Synonym) 
</div> 
<script> 
$(document).on('click', 'a.deleteRow', function() { 
    $(this).parents("div.editorRow:first").remove(); 
    return false; 
}); 
</script> 

Это NPG_ChemicalViewModel:

namespace NPG_Administrative_Utility.Models 
{ 
public class NPG_ChemicalViewModel 
{ 
    public NPG_ChemicalViewModel() 
    { 
     NPG_Chemical = new NPG_Chemical(); 
     NPG_Chemical_Synonym = new NPG_Chemical_Synonym(); 
    } 
    public NPG_Chemical NPG_Chemical { get; set; } 
    public NPG_Chemical_Synonym NPG_Chemical_Synonym { get; set; } 
} 
} 

Это Синоним модель:

namespace NPG_Administrative_Utility.Models 
{ 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 

public partial class NPG_Chemical_Synonym 
{ 
    [Key] 
    [Column(TypeName = "numeric")] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public decimal NPG_Chemical_Synonym_ID { get; set; } 

    [Column(TypeName = "numeric")] 
    public decimal NPG_Chemical_ID { get; set; } 

    [StringLength(512)] 
    public string Synonym { get; set; } 
} 
} 
+0

Как выглядит ваш 'NPG_ChemicalViewModel'? Также посмотрите, как [отправить коллекцию] (http://stackoverflow.com/questions/16501118/asp-net-mvc-3-c-sharp-post-array-of-variables). – Jasen

+0

@Jasen См. Обновление. – Layla

+0

1) Способ динамического добавления элементов формы, каждый элемент имеет идентичные атрибуты «имя» (посмотрите на визуализированный html), поэтому, когда вы отправляете привязку формы, вы не узнаете несколько своих элементов. См. Связанный вопрос в моем предыдущем комментарии. 2) Итак, вам нужно указать индекс для ваших товаров, например. 'name =" NPG_ChemicalViewModel [0] .NPG_Chemical "' 3) Вашей модели представления требуется коллекция связанных синонимов или изменить подпись действия. Создать (decimal chemId, NPG_Chemical_Synonym [] синонимы) ' – Jasen

ответ

-1

Добавить ICollection<Synonym> в модель и использовать для каждого цикла в вашем представлении. у вас может быть целых EditorFor, и вы можете скрыть/показать их jQuery. Модель привязки найдете все Synonyms для вас! и вы можете справиться с этим в своем контроллере.

Смежные вопросы