POST操作后,复杂模型为空
本文关键字:模型 复杂 操作 POST | 更新日期: 2023-09-27 18:11:27
有很多关于这个问题的帖子,但我仍然找不到正确的解决方案。目前我的模型,视图和控制器是这样的:
视图:
@model Pro.Web.Models.CatDetailsView
@using (Html.BeginForm("Details", "Cat", Model, FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()
<h2>Details</h2>
<ol>
<li>
@Html.LabelFor(model => model.Cat.Name)
<p>@Html.DisplayFor(model => model.Cat.Name, new { @readonly = "true" })</p>
</li>
<li>
@Html.LabelFor(model => model.Cat.Owner)
<p>@Html.DisplayFor(model => model.Cat.Owner.UserName, new { @readonly = "true" })</p>
</li>
<li>
@Html.LabelFor(model => model.Cat.BornDate)
<p>@Html.DisplayFor(model => model.Cat.BornDate, new { @readonly = "true" })</p>
</li>
<li>
@Html.LabelFor(model => model.Cat.Age)
<p>@Html.DisplayFor(model => model.Cat.Age, new { @readonly = "true" })</p>
</li>
<li>
@Html.LabelFor(model => model.Cat.CatColorValue)
<p>@Html.DisplayEnumFor(model => model.Cat.CatColorValue, typeof(Pro.Web.Models.Entities.Enums.CatColor))</p>
</li>
<li>
@Html.LabelFor(model => model.Cat.Description)
<p>@Html.DisplayFor(model => model.Cat.Description, new { @readonly = "true" })</p>
</li>
</ol>
<input type="submit" value="Edit details" name="Command" />
}
模型:
public class CatDetailsView
{
public Cat Cat { get; set; }
}
控制器:
[HttpPost]
public ActionResult Details(CatDetailsView model, string Command)
{
if (Command.Equals("Edit details"))
{
Cat cat = this._catRepository.Find(model.Cat.Id);
if (cat != null)
{
return RedirectToAction("Edit", "Cats", new { id = cat.Id });
}
else
{
return View(model);
}
}
else
{
return View(model);
}
}
问题是控制器总是接收null的模型。我正在查看代码,但看不出有什么问题。我刚刚开始学习,所以我可能遗漏了一些微不足道的东西。我希望有人能告诉我问题出在哪里。
谢谢。
你使用的是DisplayFor而不是EditorFor,所以你不会提交任何东西。
DisplayFor用于显示数据。
EditorFor用于添加表单输入元素,如文本框、单选按钮、复选框等。
编辑
sormii在评论中提到了这一点,所以我将把它添加到答案中。如果您希望用户能够更改正在发布的值,那么您应该使用EditorFor,但如果您只想显示数据(不允许他们更改),那么您可以在每个DisplayFor之后使用HiddenFor。这将放置一个隐藏的输入,它将被发布。
它看起来像你试图使用readonly=true,所以我认为你可能想要使用TextBoxFor为了做到这一点