2013-10-03 9 views
0

Я использую 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; 
      } 
     } 
    } 
} 

ответ

0

Использование FormCollection, так что вместо этого:

[HttpPost] 
public ActionResult Create(ClaimsViewModel viewModel) 
{ 
} 

Вы будете иметь это:

[HttpPost] 
public ActionResult Create(FormCollection formCollection) 
{ 
} 

Вы должны быть в состоянии получить значение для всех новых созданных вами, используя свое имя как и поля:

var newFieldValue = formCollection["newFieldName"]; 
Смежные вопросы