2016-08-08 29 views
0

Ich erstellte @Html.EditorFor für ICollection Liste, die so aussieht.@ Html.EditorFor sendet falschen Wert an den Controller

public virtual ICollection<DescriptionParameters> DescriptionParameters { get; set; } 

KlassenbeschreibungParameter siehe unten.

public partial class DescriptionParameters 
    { 
     public int Id { get; set; } 
     [Required (ErrorMessage = "Please enter description")] 
     public string Description { get; set; } 
     [Required(ErrorMessage = "Please enter description parameter")] 
     public string DescriptionParameter { get; set; } 
     public int Product_Id { get; set; } 

     public virtual Product ProductSet { get; set; } 
    } 

Ich erstellte @Html.EditorFor(x => x.DescriptionParameters,new {Id="DescriptEditor" }) in HTML-Form. Für diesen Editor habe ich EditorForTemplate erstellt. „-“ Taste, soll die zweite Element löscht in der Liste, statt es immer löscht erstes Element in ICollection Wenn er gedrückt wird Sekunde:

@model OnlineShop.Models.DescriptionParameters 
<script src="~/Scripts/DiscriptionParameters.js" type="text/javascript"></script> 
<table> 
    <tr> 
     <td> 
      @Html.TextBoxFor(x => x.Description, new { Id="DescriptionField",Class = "EnterDescriptionInfoField" }) 

     </td> 
     <td> 
      @Html.TextBoxFor(x => x.DescriptionParameter, new { Id = "DescriptionParamField", Class = "EnterDescriptionParameterInfoField" }) 

     </td> 
     <td> 
      <input class="AddDescription" type="button" value="+" 
        style="width:20px;height:20px" /> 
     </td> 
     <td> 
      <input class="RemoveDescription" type="button" value="-" 
        style="width:20px;height:20px;text-align:center" /> 
     </td> 
    </tr> 

</table> 
<table> 
    <tr> 
     <td> 
      @Html.ValidationMessageFor(x => x.Description) 
     </td> 
     <td style="padding-left:10px"> 
      @Html.ValidationMessageFor(x => x.DescriptionParameter) 
     </td> 
    </tr> 
</table> 

ich als nächstes Verhalten für meine Anwendung (siehe Screenshot) machen will Liste trotz meiner Wahl. EditorFor in the view

Aus diesem Grund verwende ich DiscriptionParameters script.Which sieht so aus.

$('.RemoveDescription').click(function() { 

    $.ajax({ 
     url: '/AddProductsDialog/RemoveDescriptionParameter', 
     context: this, 
     type: 'GET', 
     data: $('#AddProdForm').serialize() + "&description=" 
      + $('.EnterDescriptionInfoField').val() + "&descriptionParametr=" 
      + $('.EnterDescriptionParameterInfoField').val(), 
     success: function (product) { 
      $('#ProgressShow').empty() 
      $('#AddProdForm').replaceWith(product) 
     } 
    }) 
}) 

Das sendet Daten an die Aktionsmethode RemoveDescriptionParameter.

 [HttpGet] 
     public ActionResult RemoveDescriptionParameter(Product product,string description, 
      string descriptionParameter) 
     { 
      if(description=="") 
      { 
       description = null; 
      } 
      if (descriptionParametr == "") 
      { 
       description = null; 
      } 
      if (product.DescriptionParameters.Count > 1) 
      { 
       product.DescriptionParameters.Remove(
        product.DescriptionParameters.FirstOrDefault(x=>x.Description==description 
        && x.DescriptionParameter==descriptionParametr)); 
      } 
      GoodsContainer1 goods = new GoodsContainer1(); 
      ViewData["Categories"] = goods.CategorySet; 
      ViewData["SubCategories"] = goods.SubCategorySet; 
      return PartialView("~/Views/AddProductsDialog/AddProducts.cshtml", product); 
     } 

In RemoveDescriptionParameter Verfahren für description und descriptionParameter Parameter, erhalte ich Werte des ersten Elements in der Liste, statt chosed Listenelement.

Antwort

1

Schauen Sie sich diese Zeile in Ihrem Code an.

"& description =" + $ ('EnterDescriptionInfoField'). Val()

Ihre jQuery-Selektor ist die CSS-Klasse. Ihr Rasierer-Code wird mehr als ein Eingabefelder mit dieser css-Klasse (Überprüfen Sie einfach die Ansicht Quelle Ihrer Seite, und Sie werden es sehen), wenn Ihre DescriptionParameters mehr als ein Element enthält.

jQuery val() Methode gibt Ihnen den Wert des ersten Elements in der Menge der übereinstimmenden Elemente zurück. Das heißt, wenn Sie 3 Artikel in Ihrem DescriptionParameters Eigentum hatten, erstellen Sie Ihren Rasierklingencode 3 Tabelle und Sie haben drei Eingänge mit css Klassennamen EnterDescriptionInfoField. $('.EnterDescriptionInfoField') gibt Ihnen ein Array von 3 Eingängen, die mit dem jQuery-Selektor übereinstimmen, und val() gibt den Wert des ersten Elements im Array zurück!

Sie sollten relative jQuery Selektor (en) verwenden. Sie können die Methode jQuery closest verwenden, um die aktuelle Tabellenzeile abzurufen, und die Methode find verwenden, um die Eingabe mit der spezifischen css-Klasse abzurufen.

Dies sollte funktionieren.

$(function(){ 

    $('.RemoveDescription').click(function() { 

    $.ajax({ 
      url: '/AddProductsDialog/RemoveDescriptionParameter', 
      context: this, 
      type: 'GET', 
      data: $('#AddProdForm').serialize() + 
      "&description=" + 
          $(this).closest("tr").find('.EnterDescriptionInfoField').val() + 
      "&descriptionParametr=" + 
        $(this).closest("tr").find('.EnterDescriptionParameterInfoField').val(), 
      success: function(product) { 
       //do something with the response 
      } 
    }); 

    }); 

});