我为@Html.EditorFor
列表创建了ICollection
,看起来像这样。
public virtual ICollection<DescriptionParameters> DescriptionParameters { get; set; }
类说明参数如下所示。
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; }
}
我在Html表单中创建了@Html.EditorFor(x => x.DescriptionParameters,new {Id="DescriptEditor" })
。
对于这个编辑器,我创建了EditorForTemplate。
@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>
我想为我的应用程序制作下一个行为(参见屏幕截图):当它被按下第二个&#34; - &#34;按钮,它应该删除列表中的第二个元素,而不是,它总是删除ICollection
列表中的第一个元素,尽管我选择。
因此我使用DiscriptionParameters
脚本。看起来像这样。
$('.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)
}
})
})
将数据发送到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);
}
在description
和的descriptionParameter
的RemoveDescriptionParameter方法中
AuthType Basic
AuthName "Restricted Area"
AuthUserFile htpasswd
require valid-user
个参数,我得到列表中第一个元素的值,而不是chosed list元素。
答案 0 :(得分:1)
在代码中查看此行。
&#34;&安培;描述=&#34; + $(&#39; .EnterDescriptionInfoField&#39;)。val()
您的jQuery选择器是css类。当您的DescriptionParameters
包含多个项目时,您的剃刀代码将包含此css类的多个输入字段(只需检查页面的查看源,您将看到它)。
jQuery val()
方法返回匹配元素集中第一个元素的值。这意味着,如果您的DescriptionParameters
属性中有3个项目,则您的剃刀代码会创建3个表格,并且您将拥有3个带有css类名称EnterDescriptionInfoField
的输入。 $('.EnterDescriptionInfoField')
将为您提供与jQuery选择器匹配的3个输入数组,val()
将返回数组中第一个项的值!
您应该使用相对jQuery选择器。您可以使用jQuery closest
方法获取当前表行,并使用find方法获取具有特定css类的输入。
这应该有用。
$(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
}
});
});
});