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; }
}
为什么数据不再传递回第二个函数,以及如何正确传递数据以便将其保存到数据库?
您需要为想要返回的项生成一个输入元素。目前,您只显示两个模型元素,并且没有与它们相关联的输入。因此,它们将不会被张贴回服务器。
要让它们发布到服务器,而不是从文本框中"可编辑",请为需要返回的每个项目添加一个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必须尝试填充数据。。。它将名称/值对秘密地转换为具有值的模型类型。如果你在控制器中后没有看到任何数据,通常是因为找不到名称!