无法设置Html.HiddenFor值属性

时间:2017-11-21 04:44:04

标签: asp.net-mvc razor mvc-editor-templates html.hiddenfor

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

0 个答案:

没有答案