[英]asp.net core method to validate the viewmodel
我有一种保存方法,该方法将通过AJAX帖子列出,并通过object而不是视图model。查看 model。
在下面的示例中,我尝试检查 model state 但它始终为真且未验证。 有什么方法可以针对 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 所说,您需要解决如何将 model 传递给 ajax 的操作。
在你做之前,你需要知道如果你传递的 model 数据格式错误,后端将收到 null model。例如,InvoiceAmount 是一个小数类型的属性,如果你设置一个像"aaa"
这样的字符串或者一个空字符串" "
,它将是 null。
关于 model 绑定,您需要知道一些特殊的事情,尽管您没有传递该属性,但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
类型的属性,你不能向它们传递错误格式的数据,但你可以在不使用这些类型的属性的情况下发送 model。
看法:
@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>
}
Controller:
public JsonResult SaveInvoice([FromBody]InvoiceViewModel invoice)
{
if (ModelState.IsValid)
{
return Json(new { message = "Success" });
}
return Json(new { message = "Error" });
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.