MVC提交是';t返回所有数据

本文关键字:返回 数据 提交 MVC | 更新日期: 2023-09-27 18:26:36

我正在编写一个MVC应用程序,它最终访问SQL数据库。在我的编辑页面上,我以前有模型中所有可编辑的项目。最近我被要求不再允许用户编辑主键。我做了一个快速更改,将主键字段(在本例中,有2个)从EditorFor更改为DisplayFor。新的观点是:

@model App.Data.Item
@{
    ViewBag.Title = "Edit";
}
<h2>Edit</h2>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    <div class="form-horizontal">
        <h4>Item</h4>
        <hr />
        @Html.ValidationSummary(true)
        <div class="form-group">
            <strong>ID:</strong>
            <div class="col-md-10">
                <p>@Html.DisplayFor(model => model.ID)</p>
            </div>
        </div>
        <div class="form-group">
            <strong>ID2:</strong>
            <div class="col-md-10">
                <p>@Html.DisplayFor(model => model.ID2)</p>
            </div>
        </div>
        <div class="form-group">
            <strong>Description:</strong>
            <div class="col-md-10">
                <p>@Html.EditorFor(model => model.Description)
                @Html.ValidationMessageFor(model => model.Description)</p>
            </div>
        </div>
        <br />
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <button type="submit" class="btn btn-primary">Submit <i class="fa fa-caret-right"></i></button>
            </div>
        </div>
    </div>
}

它过去可以进行完整的编辑。现在,数据已按预期正确显示。但是,当按下submit时,Null值会传回显示值的控制器。

这些是我的控制器中的编辑功能。ItemService.Edit()只是将数据保存到服务器。它工作正常。

    [Authorize]
    public ActionResult Edit(string id)
    {
        if (id == null)
        {
            //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        string[] vals = id.Split('|');
        ItemAttribute itemAttribute = itemAttributeService.Find(int.Parse(vals[0]), vals[1]);
        if (itemAttribute == null)
        {
            return HttpNotFound();
        }
        return View(itemAttribute);
    }
    [HttpPost]
    [ValidateAntiForgeryToken]
    [Authorize]
    public ActionResult Edit([Bind(Include = "ID,ID2,Description")] 
        Item item)
    {
        if (item.Description == null)
        {
            ModelState.AddModelError("Description", "Description cannot be null.");
        }
        if (ModelState.IsValid)
        {
            itemService.Edit(item);
            return RedirectToAction("../Home/Index/");
        }
        return View(item);
    }

最后,我的数据模型:

public class Item
{
    public int ID { get; set; }
    public string ID2 { get; set; }
    public string Description { get; set; }
}

为什么数据不再传递回第二个函数,以及如何正确传递数据以便将其保存到数据库?

MVC提交是';t返回所有数据

您需要为想要返回的项生成一个输入元素。目前,您只显示两个模型元素,并且没有与它们相关联的输入。因此,它们将不会被张贴回服务器。

要让它们发布到服务器,而不是从文本框中"可编辑",请为需要返回的每个项目添加一个Html.HiddenFor()帮助程序。

   <div class="form-group">
        <strong>ID:</strong>
        <div class="col-md-10">
            <p>@Html.DisplayFor(model => model.ID)</p>
            <p>@Html.HiddenFor(model => model.ID)</p>
        </div>
    </div>
    <div class="form-group">
        <strong>ID2:</strong>
        <div class="col-md-10">
            <p>@Html.DisplayFor(model => model.ID2)</p>
            <p>@Html.HiddenFor(model => model.ID)</p>
        </div>
    </div>

但是,请记住,任何人都可以使用Firebug或Chrome控制台工具编辑HTML,并为任何字段提交他们想要的任何值,即使你不想更改它。请确保,当你将更改持久化到数据库时,你not将这些字段作为更新的一部分。

试试这个,就在这行代码之前:

@Html.DisplayFor(model => model.ID)

放入此进行调试:

@Html.LabelFor(model => model.ID)

告诉我们你看到了什么。。。

如果你看到标签,然后检查你的控制器,特别是它在帖子上的参数。根据您的模型,它应该需要和Item类型的Item。

在控制器接收数据之前,MVC必须尝试填充数据。。。它将名称/值对秘密地转换为具有值的模型类型。如果你在控制器中后没有看到任何数据,通常是因为找不到名称!