【问题标题】:set value submit from collection submit mvc从集合提交 mvc 设置值提交
【发布时间】:2016-10-02 06:59:43
【问题描述】:

我想从集合中获取控制器和模型以及特定值,这与我按下按钮的行相同

 <table id="Products" class="Products">
    <tr>
        <th>ProductId</th>
        <th>Productname</th>
        <th>Quantity</th>
        <th>UnitPrice</th>
    </tr>
    <% for(int i=0; i < Model.NorthOrderDetails.Count; i++)
       {                            %>
              <tr>
        <td><%: Html.Label(Model.NorthOrderDetails[i].ProductID.ToString()) %></td>
        <td><%: Html.Label(Model.NorthOrderDetails[i].ProductName) %> </td>
        <td><%: Html.TextBoxFor(m => m.NorthOrderDetails[i].Quantity) %></td>
        <td><%: Html.TextBoxFor(m => m.NorthOrderDetails[i].UnitPrice) %></td>
        <td><%:  @Html.ActionLink("Go to second view", "ViewTwo", "Order", Model, null)%></td>
         <input type="submit" title="ads" value =<%: Model.NorthOrderDetails[i].ProductID.ToString()%> name=ssad /> 
 <tr>
                 <% } %>

</table>

我可以在从集合提交中设置值吗,例如

     <input type="submit" title="ads" value =<%: Model.NorthOrderDetails[i].ProductID.ToString()%> name=ssad /> 

这个值将等于 17,例如在控制器中。这项工作,但是如何将按钮中的文本从集合中的值更改为任何文本?

更新 我使用 Stephen Muecke 的代码,但我编辑表格是因为我使用 aspx 页面

 <td><button type="button" class="delete" data-id="<%:Model.NorthOrderDetails[i].ProductID %>">Delete</button><td> 
    <td><input type="hidden" name="<%:Model.NorthOrderDetails[i].ProductName %>" value="<%:i %>" /><td>

不幸的是,脚本没有调用控制器

【问题讨论】:

  • 这行不通。您的提交按钮将发回包含整个集合的表单。如果您只想回发集合中的一个对象,那么您需要一种不同的方法(最好是 ajax) - 但为什么不回发整个集合呢?
  • @StephenMuecke。我想在模型中发送所有模型和一个特定的集合值,因为我想在表中获取新的/新值以在会话中更新它们,并且我想从我按下按钮的集合中删除一项
  • 一个提交按钮的值被回传,所以你可以检查FormCollection或者在POST方法中添加一个额外的参数——例如public ActionResult Views(IEnumerable&lt;YourModel&gt; model, int sad)
  • @StephenMuecke 你能编辑我的问题吗?不清楚了解
  • @StephenMuecke。这项工作 name=ssad /> 但知道我有来自集合的名称为 2,17 的按钮

标签: c# asp.net asp.net-mvc


【解决方案1】:

您可以使用 ajax 将项目 ID 值发布到删除数据库中的项目的控制器方法,然后从DOM。这将大大提高性能,意味着您可以避免使用Session

将视图更改为(抱歉,这是 Razor 语法)

  @for (int i = 0; i < Model.NorthOrderDetails.Count; i++)
  {
    <tr>
      <td>@Html.LabelFor(Model.NorthOrderDetails[i].ProductID)</td> // ToString not required
      <td>@Html.Label(Model.NorthOrderDetails[i].ProductName)</td>
      <td>@Html.TextBoxFor(m => m.NorthOrderDetails[i].Quantity)></td>
      <td>@Html.TextBoxFor(m => m.NorthOrderDetails[i].UnitPrice)</td>
      <td>@Html.ActionLink("Go to second view", "ViewTwo", "Order", Model, null)</td> // This wont work
      <td>
        <button type="button" class="delete" data-id="@Model.NorthOrderDetails[i].ProductID">Delete</button><td> // change this
        <input type="hidden" name="@Model.NorthOrderDetails.Index" value="@i" /> // add this
    </tr>
  }
  </table>
  <input type="submit" value="Save" /> // add this

注意事项:

  1. 您的操作链接不起作用(您无法将集合传递给 GET 方法)我怀疑您的意思是@Html.ActionLink("Go to second view", "ViewTwo", "Order", new { ID = Model.NorthOrderDetails[i].ProductID }, null),因此您可以将productID 传递给ViewTwo() 方法
  2. 将每一行中的提交按钮更改为普通按钮,并在末尾添加一个提交按钮(将所有更改保存到一篇文章中的文本框)
  3. Index 属性添加特殊的隐藏输入。这是使用的 由DefaultModelBinder 匹配集合 索引器是不连续的(如果您删除项目,它们将是 在集合的中间)
  4. 您不会为ProductID 呈现任何输入,这意味着您不会 能够识别回邮的产品。您将需要添加 它的隐藏输入

然后添加以下脚本

var url = '@Url.Action("Delete", "YourControllerName")';
$('.delete').click(function() {
  var id = $(this).data('id'); // Get the product ID
  var row = $(this).closest('tr') // Get the table row
  $.post(url, { ID: id }, function(data) {
    if(data) {
      row.remove(); // remove the row from the table
    } else {
      // oops!
    }
  });
});

还有控制器

public ActionResult View(IEnumerable<YourModel> model)
{
  // Save your collection and redirect
}

[HttpPost]
public JsonResult Delete(int ID)
{
  // Delete the product in the database based on the ID
  return Json(true);
}

注意:如果删除某个项目可能会以某种方式抛出异常失败,那么您应该return Json(null);以便可以在ajax方法中检查它。

【讨论】:

  • 不确定你的意思,如果脚本不调用控制器,它怎么能“工作”?您是否在浏览器控制台中收到任何错误?
  • 没有。在浏览器控制台中我没有收到错误,但控制器没有调用
  • 对不起,是$('.delete').click(function() {(省略点以表示类名)
  • 在脚本上放一个喙点并单步执行,并添加一些console.log()语句来检查变量是否正确
  • 还有你把脚本放在document.ready()函数里还是放在页面底部?
猜你喜欢
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
相关资源
最近更新 更多