ASP MVC提交列表没有映射所有值

时间:2013-11-08 13:38:14

标签: c# asp.net-mvc asp.net-mvc-4 form-submit

我有一个用户可以添加条目的表格,一旦用户完成,他们就可以添加另一个条目。

添加条目后,可以再次删除。这就是问题发生的地方。这是一个例子

ACTION:

Public ActionResult Submit(List<String> Names)
{
   //DO STUFF
}

当他们添加一个条目时,它将获取上一个条目的索引并为其添加一个隐藏字段,所以最后它看起来像这样:

HTML:

 <input type="hidden" name='Names[0]' value='John'/>
 <input type='hidden' name='Names[1]' value='Peter' />
 <input type='hidden' name='Names[2]  value='David' />

当我提交此内容时,它会正确映射所有名称。问题是用户可以在提交之前添加其中一个名称。如果他们使用值'Peter'删除输入,则html将如下所示

删除后的HTML:

 <input type="hidden" name='Names[0]' value='John'/>
 <input type='hidden' name='Names[2]  value='David' />

当提交此内容时,只会输入值为“John”的输入。

有没有人知道如何解决这个问题而不编写将重做html中所有索引的jquery函数?我正在寻找一种解决方案,我可以为绑定,覆盖或其他东西添加服务器端。我不想用jquery做这个的原因是因为我有多个页面具有这样的功能,而且为每个页面执行它将非常耗费时间。

** * ** 修改 * ** * ***

上面的代码只是一个例子,我尝试绑定的模型之一如下所示:

public class Product {
   public string Code {get;set;}
   public string Name {get;set;}
   public int Quantity {get;set;}
   public decimal Price {get;set;}

}

然后显然在我的行动中

public ActionResult Submit(List<namespace.Product> Products)
{
  //do stuff
}

4 个答案:

答案 0 :(得分:1)

您可以尝试使用Ajax jQuery更新模型,这可能会更容易。

您可以添加如下输入按钮:

<input type="button" value="Save/Update" id="saveUpdate" />
//Other HtmlCode

//Now script code
<script>
$(function(){

 $("#saveUpdate").click(function({
      $.ajax({
         url: '/myController/GetDataForInvoiceNumber',
         type: 'POST',
         data: JSON.stringify(requestData),
         dataType: 'json',
         contentType: 'application/json; charset=utf-8',
         error: function (xhr) {
            alert('Error: ' + xhr.statusText);
         },
         success: function (result) {
            CheckIfInvoiceFound(result);
         },
         async: true,
         processData: false
      });

 });

});
</script>

//Contoller
Public ActionResult Submit(Products requestData)
{
   //DO STUFF
}

这可能有效

答案 1 :(得分:0)

您不需要索引来向控制器提交列表。

Public ActionResult Submit(string[] Names)
{
   //DO STUFF
}

然后只需将Names[]更改为Names,即使您删除了项目,它仍会映射到Names参数。

<input type="hidden" name='Names' value='John'/>
<input type='hidden' name='Names`  values='David' />

答案 2 :(得分:0)

我相信你很久以前就已经知道了这一点,但看起来你有一个错字。您的示例是第二行使用“值”而不是“值”   values ='David'/&gt;

答案 3 :(得分:0)

感谢Zabavsky的评论,我找到了我正在寻找的解决方案。

我使用了非顺序索引。

以下是一个例子:

动作:

 public ActionResult Create(List<namespace.Product> Products)
 {
    //do stuff
 }

型号:

public class Product {
   public string Code {get;set;}
   public string Name {get;set;}
   public int Quantity {get;set;}
   public decimal Price {get;set;}

}

在我的表单中,html将如下所示:

<input type='hidden' name='Products.Index' value='1'/>
<input type='hidden' name='Products[1].Code' value='xyz' />
<input type='hidden' name='Products[1].Name' value='Shirt' />
<input type='hidden' name='Products[1].Quantity' value='5'/>
<input type='hidden' name='Products[1].Price' value='50'/>

<input type='hidden' name='Products.Index' value='7'/>
<input type='hidden' name='Products[7].Code' value='zxy' />
<input type='hidden' name='Products[7].Name' value='Pants' />
<input type='hidden' name='Products[7].Quantity' value='8'/>
<input type='hidden' name='Products[7].Price' value='70'/>

<input type='hidden' name='Products.Index' value='foo'/>
<input type='hidden' name='Products[foo].Code' value='1234' />
<input type='hidden' name='Products[foo].Name' value='Shoes' />
<input type='hidden' name='Products[foo].Quantity' value='2'/>
<input type='hidden' name='Products[foo].Price' value='100'/>

所有这些都将正确绑定。我必须补充的是:

<input type='hidden' name='Products.Index' value='1'/>

所有索引值只需要是唯一的就可以使用,所以只需几行jquery就可以实现这一点。

可在此处找到更多信息:Model Binding To A List

相关问题