C# 验证viewmodel的asp.net核心方法
我有一个save方法,它将通过ajaxpost调用,它传递一个对象而不是视图模型。我解析对象并构建视图模型。有没有办法验证视图模型对象 针对视图模型上定义的数据注释 在下面的示例中,我尝试检查模型状态,但它始终为true,并且不进行验证。 是否有一种方法可以对ViewModel运行验证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
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" });
}