回到目錄
有一句話,在10年前就是真理,到現在也一直都是,“前端驗證可以沒有,但後端驗證必須要有”,這句話相信大家都沒有意見吧,前端驗證一般指通過JS方式實作的,友好的,個性的驗證方式,而後端驗證是指從表單送出過來,要進行入庫之前的,資料有效性的驗證,它不需要有美麗的外表,它需要有的僅僅是“有效”!
下面我将到MVC環境裡的前端驗證和後端驗證作一個詳細的說明,一個使用上的說明。
前端驗證(KnockoutJs實作)
//建立訂單使用knockoutJs
var CreateOrder = function () {
var self = this;
self.productid = ko.observable().extend({
required: true
});
self.productname = ko.observable().extend({
required: true
});
self.username = ko.observable().extend({
required: true
});
self.price = ko.observable().extend({
required: true,
min: { params: 1, message: "價格要是大于(0)的整數!" }
});
self.count = ko.observable().extend({
required: true,
min: { params: 1, message: "您最少也要買一個吧!" },
max: { params: 100, message: "最大一次隻能買(100)個!" }
});
self.Do = function () {//ko方法名需要是大寫的
self.errors = ko.validation.group(self);
if (self.isValid()) {
$.ajax({
url: "/order/doOrder",
type: "POST",
data: { productid: self.productid(), productname: self.productname(), price: self.price(), count: self.count(), username: self.username() },
success: function (data) {
if (data.code == 1) {
location.href = location.href;
}
else
alert(data.code);
}
})
} else {
self.errors.showAllMessages();
}
}
}
ko.applyBindings(new CreateOrder());
後端驗證(資料實體有效性驗證和ViewModel業務規則驗證)
在這裡多說兩句,資料實體有效性驗證是指和資料表相關的驗證規則,如你的UserName字段長度為128字元,那麼,你的實體驗證的長度就是128,而ViewModel業務規則驗證是指針對具體業務設計的視圖模型,如使用者注冊子產品,在這個子產品裡,你的UserName被産品經理規則為50個字元,那麼,你的這個業務規則驗證的長度就是50,當然,你的其它業務可能也用到了UserName字段,而它的業務規則當然可以不同,這就是有效性和業務規則。
下面代碼是一個傳回Json結果的Post請求方法,代碼如下
public JsonResult DoOrder(int productid, string username, string productname, decimal price, int count)
{
var entity = new Entity.Order_Info
{
TotalPrice = price * count,
UserId = userid,
UserName = username,
AddDate = DateTime.Now,
Info = "使用者下單",
Order_Detail = new List<Order_Detail> { new Order_Detail { Count = count, ProductId = productid, ProductName = productname, SalePrice = price } }
};
if (productid <= 0)
{
ModelState.AddModelError("ProductId", "商品ID不合法...");
}
#region 在action裡拼接ModelState錯誤消息
var errors = new StringBuilder();
foreach (string key in ViewData.ModelState.Keys)
{
ModelState modelState = ViewData.ModelState[key];
foreach (ModelError error in modelState.Errors)
{
errors.Append(error.ErrorMessage + ",");
}
}
#endregion
if (entity.IsValid && ModelState.IsValid)
orderService.DoOrder(entity);
else
return Json(new { code = entity.GetRuleViolationMessages() + errors });
return Json(new { code = 1 });
}
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!