2016-05-04 31 views
1

我遵循在线教程,使用ajax动态地将项目添加到绑定列表模型,该工作完美。 (http://www.mattlunn.me.uk/blog/2014/08/how-to-dynamically-via-ajax-add-new-items-to-a-bound-list-model-in-asp-mvc-net/comment-page-2/#comment-68909将项目移除到ASP中的绑定列表模型MVC.NET

我的问题是,我将如何正确地从列表中删除项目? 现在我所做的是添加一个删除链接,点击时从视图中删除该项目。但是,当我提交表单时,我注意到modelState不再有效,并且对于从视图中移除的项目,它具有空条目。所以我猜这个模型没有被更新。

Test.cshtml

@model TesterManager.Models.Test 

<div class="form-group"> 
    @Html.LabelFor(model => model.Software, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     <div class="form-group"> 
      <div class="col-md-5"> 
       @Html.DropDownListFor(m => m.Software, TesterManager.Models.Helper.GetTestSoftwares(), "Choose a USB Card", new { @class = "form-control" }) 
       @Html.ValidationMessageFor(model => model.Software, "", new { @class = "text-danger" }) 
      </div> 
      <div class="col-md-5"> 
       @Html.EditorFor(model => model.Version, new { htmlAttributes = new { @class = "form-control", @title = "Enter a USB FW Version", @placeholder = "Enter a USB FW Version" } }) 
       @Html.ValidationMessageFor(model => model.Version, "", new { @class = "text-danger" }) 
      </div> 
      <div class="col-md-2"> 
       <a href="#" id="remove-test" onclick="$(this).parent().parent().parent().parent().remove();">Delete</a> 
      </div> 
     </div> 
    </div> 
</div> 

AdminTesterConfigurations.cshtml(片断):

@model TesterManager.Models.AdminTesterConfigurations 

<div class="form-group"> 
    <div class="col-md-6"> 
     .... 
    </div> 
</div> 
<hr /> 
<div class="form-group"> 
    <div class="col-md-12"> 
     <h3>Test Software</h3> 
     <div id="test-list"> 
      @Html.EditorForMany(x => x.Tests, x => x.Index) 
     </div> 
     <input type="button" id="add-test" value="Add" /> 
    </div> 
</div> 

RequestEditViewModel.cshtml:

@model TesterManager.Models.RequestEditViewModel 

<div class="form-horizontal"> 

    @Html.ValidationSummary(true, "", new { @class = "text-danger" })  
    @Html.EditorFor(model => model.ShippingLocation) 
    @Html.EditorFor(model => model.RequesterTesterConfigurations) 


    @Html.EditorFor(model => model.AdminTesterConfigurations)      

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" value="Save" class="btn btn-default" /> 
     </div> 
    </div> 
</div> 

Edit.cshtml:

@model TesterManager.Models.RequestEditViewModel 

@Styles.Render("~/Content/Edit") 

@{ 
    ViewBag.Title = "Edit"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

@section Scripts 
{ 
    <script> 
     jQuery(document).ready(function ($) { 
      $('#add-test').on('click', function() { 
       jQuery.get('/TesterManager/Request/AddTest').done(function (html) { 
        $('#test-list').append(html); 
       }); 
      }); 
     }); 
    </script> 
} 


@using (Html.BeginForm()) 
{ 
    <h2>Edit</h2> 

    @Html.AntiForgeryToken() 
    @Html.EditorFor(x => x); 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

RequestController.cs

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(RequestEditViewModel request) 
    { 
     if (ModelState.IsValid) 
     { 
      Request domainRequest = new Request(request); 
      requests.Add(domainRequest); 
      return RedirectToAction("Index"); 
     } 
     return View(request); 
    } 

    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
    public ActionResult AddTest() 
    { 
     var request = new RequestEditViewModel(); 
     request.AdminTesterConfigurations.Tests.Add(new Test()); 

     return View(request); 
    } 
+0

请参阅答案[这里](http://stackoverflow.com/questions/29161481/post-a-form-array-without-successful/29161796#29161796)和[这里](http://stackoverflow.com/questions/28019793/submit-same-partial-view-called-multiple-times-data-to-controller/28081308#28081308) - 您需要集合索引器的隐藏输入。 –

+0

我正在使用本教程中引用的扩展。 我可以做@ Html.EditorForMany(x => x.Tests,x => x.Index) 它将隐藏的输入与索引相加。 让我知道如果我误解你 – AndeeC

+0

如果该扩展方法正常工作,那么你的问题是什么?我只能假设它不起作用,在这种情况下,如果您想获得最佳性能,请使用'BeginCollectionItem()'HtmlHelper(请参阅第二个链接)或客户端模板选项。 –

回答

1

我意识到问题是,当我将从列表中视图中删除的项目,我并没有消除对集合索引隐藏的输入,以及。我更新了代码以删除隐藏的输入,现在它工作正常。

相关问题