Я использую MVC и бритву.Метод POSt для динамически создаваемых полей ввода AJAX
Я успешно выполнил способ для пользователя динамически добавлять дополнительные строки ввода одним нажатием кнопки (используя AJAX и следующий блог Стивена Сандерсона). BUT Я не знаю, как сохранить данные в базе данных, которую пользователь вводит в эти динамически создаваемые поля.
Я использую его вспомогательный класс, который, откровенно говоря, я пытаюсь понять вообще.
Мой вопрос заключается в том, что мне нужно добавить в метод создания POST. Ссылка на код блога в этом блоге: steven sanderson's blog
Просто стрелка в правильном направлении - это все, что мне нужно. Это мой текущий код:
Новый ряд частичный вид:
@model ef_tut.ViewModels.ClaimsViewModel
@using ef_tut.WebUI.Helpers
@using (Html.BeginCollectionItem("claims"))
{
<table class="editorRow">
<tr >
<td>
SubmissionUserID: @Html. EditorFor (o.claim.SubmissionUserID)
</td>
<td>
ClaimID: @Html.EditorFor(o => o.claim.ClaimID)
</td>
<td>
@Html.EditorFor(o => o.claim.ApprovedYN)
</td>
<td>
ClaimID(claimlinetable)@Html.EditorFor(o => o.claimline.ClaimID)
</td>
<td>
ClaimantUserID: @Html.EditorFor(o => o.claimline.ClaimantUserID)
</td>
<td>
Hours: @Html.EditorFor(o => o.claimline.Hours)
</td>
<td>
MileageCost: @Html.EditorFor(o => o.claimline.MileageCost)
</td>
<td>
TravelCost: @Html.EditorFor(o => o.claimline.TravelCost)
</td>
<td>
Hours cost: @Html.EditorFor(o => o.claimline.HoursCost)
</td>
<td>
Total cost: @Html.EditorFor(o => o.claimline.TotalCost)
</td>
<td>
ProxyYN: @Html.EditorFor(o => o.claimline.ProxyClaim)
</td>
<td>
CatID: @Html.EditorFor(o => o.claimline.CatID)
</td>
<td>
SubCatID: @Html.EditorFor(o => o.claimline.SubCatID)
</td>
<td>
<a href="#" class="deleteRow">delete</a>
</td>
</tr></table>
}
Blankeditorrowmethod
public PartialViewResult BlankEditorRow()
{
return PartialView("NewRow", new ClaimsViewModel());
}
Мой текущий метод POST, который создает новые БД записи, но все поля равны нулю
[HttpPost]
public ActionResult Create(ClaimsViewModel viewModel)
{
if (ModelState.IsValid)
{
db.claims.Add(viewModel.claim);
db.claimlines.Add(viewModel.claimline);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(viewModel);
}
Создать вид
@model ef_tut.ViewModels.ClaimsViewModel
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>claim</legend>
<div id="editorRows"></div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Add another...", "BlankEditorRow", null, new { id = "addItem" })
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
JQuery
$("#addItem").click(function() {
$.ajax({
url: this.href,
cache: false,
success: function (html) { $("#editorRows").append(html); }
});
return false;
});
$("a.deleteRow").live("click", function() {
$(this).parents("table.editorRow:first").remove();
return false;
});
помощник Стивена
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
namespace ef_tut.WebUI.Helpers
{
public static class HtmlPrefixScopeExtensions
{
private const string idsToReuseKey = "__htmlPrefixScopeExtensions_IdsToReuse_";
public static IDisposable BeginCollectionItem(this HtmlHelper html, string collectionName)
{
var idsToReuse = GetIdsToReuse(html.ViewContext.HttpContext, collectionName);
string itemIndex = idsToReuse.Count > 0 ? idsToReuse.Dequeue() : Guid.NewGuid().ToString();
html.ViewContext.Writer.WriteLine(string.Format("<input type=\"hidden\" name=\"{0}.index\" autocomplete=\"off\" value=\"{1}\" />", collectionName, html.Encode(itemIndex)));
return BeginHtmlFieldPrefixScope(html, string.Format("{0}[{1}]", collectionName, itemIndex));
}
public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
{
return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
}
private static Queue<string> GetIdsToReuse(HttpContextBase httpContext, string collectionName)
{
string key = idsToReuseKey + collectionName;
var queue = (Queue<string>)httpContext.Items[key];
if (queue == null)
{
httpContext.Items[key] = queue = new Queue<string>();
var previouslyUsedIds = httpContext.Request[collectionName + ".index"];
if (!string.IsNullOrEmpty(previouslyUsedIds))
foreach (string previouslyUsedId in previouslyUsedIds.Split(','))
queue.Enqueue(previouslyUsedId);
}
return queue;
}
private class HtmlFieldPrefixScope : IDisposable
{
private readonly TemplateInfo templateInfo;
private readonly string previousHtmlFieldPrefix;
public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix)
{
this.templateInfo = templateInfo;
previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix;
templateInfo.HtmlFieldPrefix = htmlFieldPrefix;
}
public void Dispose()
{
templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix;
}
}
}
}