Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证viewmodel的asp.net核心方法_C#_Asp.net Core - Fatal编程技术网

C# 验证viewmodel的asp.net核心方法

C# 验证viewmodel的asp.net核心方法,c#,asp.net-core,C#,Asp.net Core,我有一个save方法,它将通过ajaxpost调用,它传递一个对象而不是视图模型。我解析对象并构建视图模型。有没有办法验证视图模型对象 针对视图模型上定义的数据注释 在下面的示例中,我尝试检查模型状态,但它始终为true,并且不进行验证。 是否有一种方法可以对ViewModel运行验证 public class InvoiceViewModel { public long InvoiceId { get; set; [Displa

我有一个save方法,它将通过ajaxpost调用,它传递一个对象而不是视图模型。我解析对象并构建视图模型。有没有办法验证视图模型对象 针对视图模型上定义的数据注释

在下面的示例中,我尝试检查模型状态,但它始终为true,并且不进行验证。 是否有一种方法可以对ViewModel运行验证

 public class InvoiceViewModel
    {
    
        public long InvoiceId { get; set;
    
          [Display(Name = "Invoice Number"),Required]
        public string InvoiceNumber { get; set;}
    
        [Display(Name = "Type"),Required]
        public  string InvoiceType { get; set; }
       
        [Display(Name = "Amount"),Required]
        public decimal InvoiceAmount { get; set; }
    }

   
    // controller method
    public JsonResult SaveInvoice([FromBody] object invoice)
    {
         // parse through the invoice object
         var invoiceVM = GetInvoiceViewModel(invoice)
         // I tried the ModelState.IsValid - it did nto work
         // how can I validate invoiceVM against the data annotation defined
    }

     
    public InvoiceViewModel GetInvoiceViewModel(object invoice)
    {
    }

正如Camilo Terevinto所说,您需要修复如何通过ajax将模型传递给action

在执行此项工作之前,您需要知道,如果您传递的模型数据包含错误的格式,后端将接收空模型。例如,InvoiceAmount是十进制类型的属性,如果您设置了类似于
“aaa”
的字符串或空字符串
,则该属性将为空

还有一些关于模型绑定的特别的您需要知道,
long
decimal
类型属性具有默认值0,尽管您没有传递属性。Reuiqred属性对此不起作用

例如,您可以看到以下gif,我不仅不传递值,而且也不传递
InvoiceAmount
属性(关于如何不传递属性,您可以检查以下代码)。但在后端,您可以看到InvoiceAmount的默认值为0:

var data = {
            InvoiceId: $("#InvoiceId").val(),
            InvoiceNumber: $("#InvoiceNumber").val(),
            InvoiceType: $("#InvoiceType").val(),
            //InvoiceAmount: $("#InvoiceAmount").val()  //remove this... 
        }

作为结论,也就是说,对于
long
decimal
类型属性,您不能向它们传递错误的格式数据,但您可以发送模型而不使用这些类型的属性

下面是一个完整的工作演示: 视图:

结果:

是的,方法就是正确地做事。不要接受
对象
,接受特定类型,然后在那里进行验证。@CamiloTerevinto-我首先尝试了页面设置的方式,特定类型(viewmodel)在ajax Post中显示为null,然后这是一个您必须解决的问题,而不仅仅是完全关闭模型验证。
@model InvoiceViewModel
<form>
    <div>
        <label asp-for="InvoiceId"></label>
        <input asp-for="InvoiceId" class="form-control" />
    </div>
    <div>
        <label asp-for="InvoiceNumber"></label>
        <input asp-for="InvoiceNumber" class="form-control" />
    </div>
    <div>
        <label asp-for="InvoiceType"></label>
        <input asp-for="InvoiceType" class="form-control" />
    </div>
    <div>
        <label asp-for="InvoiceAmount"></label>
        <input asp-for="InvoiceAmount" class="form-control" />
    </div>
    <div>
        <input type="button" value="post" onclick="PostData()" />
    </div>
</form>
@section Scripts
{
<script>
    function PostData() {
        var data = {
            InvoiceId: $("#InvoiceId").val(),
            InvoiceNumber: $("#InvoiceNumber").val(),
            InvoiceType: $("#InvoiceType").val(),
            InvoiceAmount: $("#InvoiceAmount").val()
        }
        console.log(data);
        console.log(JSON.stringify(data));
        $.ajax({
            url: "/Home/SaveInvoice",
            type: "POST",
            contentType: "application/json; charset=utf-8",  //be sure add this...
            data: JSON.stringify(data),
            success: function (res) {
                alert(res.message);
            }
        })
    }
</script>
}
public JsonResult SaveInvoice([FromBody]InvoiceViewModel invoice)
{
    if (ModelState.IsValid)
    {
        return Json(new { message = "Success" });
    }
    return Json(new { message = "Error" });
        
}