ASP.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; }
}
}
Как выглядит ваш 'NPG_ChemicalViewModel'? Также посмотрите, как [отправить коллекцию] (http://stackoverflow.com/questions/16501118/asp-net-mvc-3-c-sharp-post-array-of-variables). – Jasen
@Jasen См. Обновление. – Layla
1) Способ динамического добавления элементов формы, каждый элемент имеет идентичные атрибуты «имя» (посмотрите на визуализированный html), поэтому, когда вы отправляете привязку формы, вы не узнаете несколько своих элементов. См. Связанный вопрос в моем предыдущем комментарии. 2) Итак, вам нужно указать индекс для ваших товаров, например. 'name =" NPG_ChemicalViewModel [0] .NPG_Chemical "' 3) Вашей модели представления требуется коллекция связанных синонимов или изменить подпись действия. Создать (decimal chemId, NPG_Chemical_Synonym [] синонимы) ' – Jasen