我正在尝试使用编辑器模板和实体框架制作自定义创建表单。我遇到的问题是我的所有字段都没有设置值属性。这在处理隐藏键值时会在 ModelState 中引发错误,因为它本质上没有任何值。这是我正在做的一个例子。
汽车.cs
public class Car
{
[Key]
[HiddenInput(DisplayValue = false)]
public int CarID{ get; set; }
[required]
public string Make { get; set; }
[required]
public string ModelName { get; set; }
[required]
public int Year { get; set; }
}
Car.cshtml(编辑器模板)
@model Car
@Html.HiddenFor(c => c.CarID, new { Value = "0" })
@Html.EditorFor(c => c.Make)
@Html.EditorFor(c => c.ModelName)
@Html.EditorFor(c => c.Year)
CreateCar.cshtml(查看)
@model Car
<form id="create-car-form" method="post">
@Html.EditorForModel()
<a onclick="SubmitForm()">Submit</a>
</form>
现在这只是一个例子。我实际上是通过 ajax 调用提交我的表单以避免重新加载页面,并且我正在我的编辑器模板中设置 Make 和 ModelName 的下拉列表。但是,只要在表单中输入信息,我就可以在我的控制器操作中获取所有信息。
如果某个字段留空,则 ModelState 会收到错误,因为在预期某个值时该值是空的。这尤其是隐藏字段的问题,因为它无法从用户那里接收值,我也不希望它接收。
进一步探索表明,为字段生成的 Html 都有一个空的 'value' 属性。我的意思是输入标签在检查器中看起来像这样:
<input data-val="true" data-val-required="The CarID field is required." id="CarID" name="CarID" type="hidden" value>
但是从检查器复制元素并粘贴它会给出:
<input data-val="true" data-val-required="The CarID field is required." id="CarID" name="CarID" type="hidden" value="">
这显然是我的罪魁祸首,但我不明白为什么在编辑器模板中指定 value 属性时没有设置它。
编辑 CarsView.cshtml
<div>
@Html.Partial("CreateCar", new Car());
</div>
JavaScript
function SubmitForm() {
var form = $('#create-car-form');
$.ajax({
type: "POST",
url: "Home/CreateCar",
data: form.serialize(),
dataType: 'html',
success: function (data) {
console.log(form.serialize();
}
});
}
控制台日志将显示form.serialize()
返回以下字符串:
"CarID=&ModelName=Camry&Make=Toyota&Year=2010"
这表明 CarID 没有任何价值。这也是我迄今为止用于应用程序的唯一 JS,它发生在表单已经设置之后,这就是为什么我相信 Html 助手发生了一些奇怪的事情。