首页 > 解决方案 > 如何将 htmlhelper 的值从表(视图)传递给控制器​​?

问题描述

我想在针对特定 ID 单击更新按钮时仅更新一行中的单个值,该 ID 在控制器中可用,但更新的值字段不可用,因此当我按下更新按钮时,控制器更新了数据库但存储了一个数据库中的空值。

//View Code
<tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(m => item.Id)
                </td>
                <td>
                    @Html.DisplayFor(m => item.TagName)
                </td>
                <td>
                    @Html.DisplayFor(m => item.TagCategory)
                </td>
                    <td>
                     @Html.TextBoxFor(m => item.TagValue, new { htmlAttributes = new { @class = "form-control" } })
                    </td>
                <td>
                    @Html.ActionLink("Update", "Update", new { id = item.Id}, new { htmlAttributes = new { @class = "form-control" } })
                </td>
            </tr>
        }
    </tbody>
//Controller Code
 public ActionResult Update([Bind(Include = "Id,TagValue") ]Tag tags)
    {
        var data = db.Tags.Where(x => x.Id == tags.Id).FirstOrDefault();
        if (data!=null)
        {
            data.TagValue = tags.TagValue;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View();
    }

标签: c#sqlasp.net-mvcmodel-view-controller

解决方案


所以现在你的更新按钮发出一个 GET 请求。数据库存储 null 是因为当您创建 ActionLink 时,您没有将 TagValue 作为参数传递,因为对于 GET 请求,变量需要在 url 中传递。您可以像这样添加 TagValue 作为参数

@Html.ActionLink("Update", "Update", new { id = item.Id, TagValue = item.TagValue }, new { htmlAttributes = new { @class = "form-control" } })

我认为这不会按照您想要的方式工作,因为我假设您希望用户能够更改 TagValue 的值,然后点击更新以保存该值。这个解决方案所做的只是获取 TagValue 的原始值。

如果您希望能够编辑 TagValue 然后提交,您可以将您的 html 更改为如下所示

<tbody>
@foreach (var item in Model)
{
    <tr>
        <form action="@Url.Action("Update")" method="post">
            <td>
                @Html.HiddenFor(m => item.Id, new { @Name = "Id" })
                @Html.DisplayFor(m => item.Id)
            </td>
            <td>
                @Html.DisplayFor(m => item.TagName)
            </td>
            <td>
                @Html.DisplayFor(m => item.TagCategory)
            </td>
            <td>
                @Html.TextBoxFor(m => item.TagValue, new { @class = "form-control", @Name="TagValue"  })
            </td>
            <td>
                <input type="submit" value="Update" />
            </td>
        </form>
    </tr>
}

这将为您拥有的每个标签创建一个表单,然后在您点击提交时生成一个 POST 请求。

vikscool 的评论也是您可以使用的另一个很好的解决方案。


推荐阅读