.NET MVC 5 中的 Javascript 对象绑定(bind)和服务器端验证

标签 javascript c# jquery asp.net-mvc model-binding

我的项目中有一个类,如下所示:

public class MyClass
{
   [Required]
   public string keyword { get; set; }
   public string saleRange { get; set; }
}

Action 是这样的:

[HttpPost]
    [ActionName("Analyze")]
    public ActionResult Analyze(MyClass obj)
    {
        if (!ModelState.IsValid)
        {
            return Json("error");
        }
        else
        {
            return Json("ok");
        }
    }

在 jQuery 中:

  $(document).on("click",".btnAnalyze",function() {
        var data =
        {
            keyword: $(".keywordInput").val(),
            saleRange: "1"
        };
        console.log($(".keywordInput").val());
        $.post("/Controller/Analyze",data).done(function(){
            if (data == "error") {
                alert("all fields are required");
            }
        });
    });

如您所见,我正在将一个 JS 对象映射到一个传递给操作的 C# 类对象。现在这里的问题是,即使我没有为关键字属性提供任何东西(即它是 null 或“”),ModelState 仍将其属性 IsValid 显示为 true,但如果我不这样做,它应该设置为 false不要将任何内容作为关键字参数传递。

这是问题的第一部分,我在这里遇到的另一个问题是,如果我有 10 个文本框字段,其中所有字段都是必需的,我该怎么办。如果用户只输入其中的 1/10,我想为第一个下一个字段发送一条消息,用户必须验证才能继续,比如“需要 texbox #2,请输入一些东西”,而不是一般的消息比如“所有字段都是必需的”或类似的东西?

有人可以帮我解决这个问题吗?

为什么模型状态显示它是有效的,即使我没有在对象中提供关键字参数?

@T.Jung 这里是一个输入样本:

 <input placeholder="Enter keywords" class="form-control keywordInput" type="text" style="width:80%">

它基本上只是一个简单的 html 输入字段..

最佳答案

您可以使用表单验证,它会在客户端执行数据注释验证,您不必去服务器端。

 $('#btnAnalyze').on('click', function (evt) {
    if ($('#YourformId').valid()) {
       //Perform AJAX call
    }

这样,如果任何验证不起作用,form.valid() 将抛出数据注释错误。因此,您可以将 Required 添加到模型中的这些字段,这将确保在验证失败时不会发送数据。

关于.NET MVC 5 中的 Javascript 对象绑定(bind)和服务器端验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44703070/

相关文章:

javascript - 如何仅按文件夹名称导入桶?

javascript - Angular 网站无法在移动设备上打开

c# - Entity Framework 继承和关系

jQuery 和 AJAX 或服务器发送的事件

javascript - 查找某个单词的所有实例并替换为 HTML

javascript - 使用 jQuery 动态更改 CSS 值

c# - Include 内使用的 Lambda 表达式无效

c# - Web Api 服务器端处理和数据表参数

javascript - 根据外部 javascript 文件中的单选按钮单击更改输入文本

jquery bootgrid 与 requestHandler/post 重新加载有关的问题