1

我正在尝试利用 MVC 中的内置验证,但它似乎不起作用。如果我将表单中的字段留空,我会返回“成功保存”。信息。

不应该在表格中将“必填”字段标记为必填吗?

形成图像

控制器:

    public ActionResult Create([DataSourceRequest] DataSourceRequest request, ACore.Asset assetForm)
    {
        var results = new
        {
            value = false,
            Message = ""
        };

        if (ModelState.IsValid)
        {
            results = new
            {
                value = true,
                Message = "Successfully Saved."
            };

            return Json(results);
        }

        results = new
        {
            value = false,
            Message = "Please check the form values."
        };

        return Json(results);
    }

查看(精简):

@using (Html.BeginForm("Create", "Asset", FormMethod.Post, new { id = "frmAsset"}))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <div class="tempStyle">
        <div class="editor-label fl">
            @Html.LabelFor(model => model.AssetName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.AssetName)
            @Html.ValidationMessageFor(model => model.AssetName)
        </div>
    </div>
    <div style="position: relative;">
        <input type="button" value="Save" id="btnSave" />
    </div>

处理我的保存的 JavaScript:

    var saveAsset = function (e) {
        var form = $("#frmAsset");
        $.ajax({
            type: "POST",
            url: "/Asset/Create",
            data: $(form).serialize(),
            success: function (data) {
                if (data.value == true) {
                    alert(data.Message);

                    // Close popup window
                    var window = $('#AssetEditorPopUp').data("kendoWindow");
                    window.close();

                    // Refresh grid to show changes
                    $('#grid').data("kendoGrid").dataSource.read();

                    return;
                }

                alert(data.Message);

            },

            error: function () {
                alert("There was an error editing the asset.");
            }
        });
    };

模型:

public class Asset
{
    [ScaffoldColumn(false)]
    public int AssetId { get; set; }

    [Required]
    [Display(Name="Asset Name:")]
    public string AssetName { get; set; }

    public string AssetFormerName { get; set; }
    public string Seg1Code { get; set; }
    public string Seg3Code { get; set; }
    public bool? ActiveFlag { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string AssetType { get; set; }

    [Display(Name = "ZipCode:")]
    [RegularExpression("([a-zA-Z0-9 .&'-]+)", ErrorMessage = "Enter only alphabets and numbers of First Name")]
    public string ZipCode { get; set; }
}

这就是我做 POST 而不是 ajax 的结果。

在此处输入图像描述

4

1 回答 1

1

您的按钮设置为按钮类型,它应该是提交。您没有触发表单提交处理程序,因此没有执行验证。

像这样创建您的表单:

@using (Html.BeginForm("Create", "Asset", FormMethod.Post, new { id = "frmAsset"}))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

<div class="tempStyle">
    <div class="editor-label fl">
        @Html.LabelFor(model => model.AssetName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.AssetName)
        @Html.ValidationMessageFor(model => model.AssetName)
    </div>
</div>
<div style="position: relative;">
    <input type="submit" value="Save" id="btnSave" />
</div>

然后您可以使用以下javascript:

$(function(){
    $("#frmAsset").submit(function(evt){
        var form = $(evt.currentTarget);

        if(form.validate().isvalid()
        {
             // your handler here
        }
        evt.preventDefault();  // prevent the form from posting normally
        return false;
    };
};

我会看看 AJAX.BeginForm 助手,它更适合你在这里做的事情。

注意。我没有在 ide 中输入这个,所以我不知道它是否 100% 有效,你需要测试它。

于 2013-05-08T08:08:13.063 回答