我正在尝试使用编辑器模板和实体框架创建自定义创建表单。我遇到的问题是我的所有字段都显示没有设置值属性。这在处理隐藏键值时会在ModelState中引发错误,因为它基本上没有值。这是我正在做的一个例子。
Car.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属性时,我无法理解为什么没有设置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助手会发生一些奇怪的事情。