1

我正在尝试使用编辑器模板和实体框架制作自定义创建表单。我遇到的问题是我的所有字段都没有设置值属性。这在处理隐藏键值时会在 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 助手发生了一些奇怪的事情。

4

0 回答 0