只能更新MVC中结果集的第一条记录

时间:2014-01-13 15:48:22

标签: asp.net asp.net-mvc

我已经接管了MVC应用程序的支持,但遗憾的是对MVC的经验或知识非常少,所以如果这是一个愚蠢的问题我会提前道歉。

我们将每个结果放入HTML中列出的项目中,然后隐藏除一条记录之外的所有项目,这样您就可以使用First / Prev / Next / Last按钮过滤不同的条目,全部通过jQuery:

$("a#next").on("click", function () {
  var nextli = $("li.first");
  if ($(nextli).is(":last-child")) {
     return false;
  }
  nextli.removeClass("first").addClass("record").next().addClass("first").removeClass("record");
});
$("a#previous").on("click", function () {
  var nextli = $("li.first");
  if ($(nextli).is(":first-child")) {
     return false;
  }
  nextli.removeClass("first").addClass("record").prev().addClass("first").removeClass("record");
});

这很好,并且显示记录没有任何问题,但是当您尝试编辑任何记录但第一个记录时,会出现"System.ArgumentNullException: Value cannot be null."错误。

以下是编辑功能控制器中的代码:

[HttpPost]
public ActionResult Edit(RecordsView rv)
{
    if (ModelState.IsValid)
    {
        repository.EditRecord(rv.Records.FirstOrDefault().DogIncident);
    }

    return RedirectToAction("Index");
}

这是在cshtml文件的开头定义的:

@using (Html.BeginForm("Edit", "Home", FormMethod.Post,new {@class="record-view"}))

最后,这是在视图上生成HTML的方式:

<li class="first" id="record-1805">
    <form action="/Home/Edit" class="record-view" method="post">
        <ul>
            [form elements]
            <li><input type="submit" style="margin: 18px 0;" value="Save"></li>
        </ul>
    </form>
</li>

<li class="record" id="record-1804">
    <form action="/Home/Edit" class="record-view" method="post">
        <ul>
            [form elements]
            <li><input type="submit" style="margin: 18px 0;" value="Save"></li>
        </ul>
    </form>
</li>

<li class="record" id="record-1803">
    <form action="/Home/Edit" class="record-view" method="post">
        <ul>
            [form elements]
            <li><input type="submit" style="margin: 18px 0;" value="Save"></li>
        </ul>
    </form>
</li>

有谁请知道为什么我只能编辑显示的第一条记录而不能编辑其他记录?即使我使用下一个/后退按钮查看记录并返回第一个记录来提交它,它也会更新,但更新任何其他记录会产生错误。

1 个答案:

答案 0 :(得分:1)

引用Darin的帖子:Pass a parameter to a controller using jquery ajax带你到中途。他在jQuery中使用输入值并将其传递给Controller Action。

通常,您会为每个记录提供一个输入链接或@ Html.ActionLink以进行编辑,MVC将绑定到您的操作的控件参数(ID或您想要的任何内容),只需在操作上使用相同的名称链接作为参数,它将在帖子中映射。

data: { input: $('#caption').val() },

更改控制器操作的签名,或添加另一个带有“int”的操作,如下所示。

[HttpPost]
public ActionResult Edit(int ID = 0)
{
    if (ModelState.IsValid)
    {
        repository.EditRecord(rv.Records.Where(r => r.ID == ID).DogIncident);
    }

    return RedirectToAction("Index");
}

您可以发布完整视图,以便我们完成解决方案吗? 期待cshtml视图。这是一个例子:

@model IEnumerable<yourModelName>
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.NID)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.CreatedOn)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ExtensionAttribute15)
        </th>
        <th></th>
    </tr>
@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.yourElement1)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.yourElement2)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
        </td>
    </tr>
}
    </table>
@section Scripts{
    <script type="text/javascript">
        $("a#next").on("click", function () {
            var nextli = $("li.first");
            if ($(nextli).is(":last-child")) {
                return false;
            }
            nextli.removeClass("first").addClass("record").next().addClass("first").removeClass("record");
        });
        $("a#previous").on("click", function () {
            var nextli = $("li.first");
            if ($(nextli).is(":first-child")) {
                return false;
            }
            nextli.removeClass("first").addClass("record").prev().addClass("first").removeClass("record");
        });
    </script>
}