最近在學 asp.net MVC. 我在Contrller 裡加了一個 Action:SAVE。按以前的習慣,就把存檔前檢查的動作寫在Controller裡面。後來發現網路上的大神都建議程式邏輯要放在 Model,我就試著把檢查規則放到 Model裡,實作了 Validate
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (this.DETAIL_TABLE1.Length==0 )
yield return new ValidationResult("明細必須有資料!");
}
但是我發現,雖然在 Controller 中可以得到IsValid!=true的結果,但無法得到 ValidationResult 的內容。
先說一下,我的 SAVE 並沒有View,它只提供給前端的 ajax 呼叫。也就是說,這個SAVE retrn的是 json result:
if (!ModelState.IsValid)
{
//這邊能get 到 ValidateRestult 嗎?
JObject jo = new JObject();
jo.Add("result", false);
jo.Add("msg", "Validatetion Error!");
return Content(JsonConvert.SerializeObject(jo), "application/json");
}
我的問題是,有可能在Controller中得到 Model 的ValidateResult,然後轉成 json result,傳給前端嗎?
if (!ModelState.IsValid)
{
var errorMsg = ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage);
return Json(errorMsg);
}
取得JQGRID部分程式碼
因私密關係,簡陋了點
[HttpPost]
[ValidateInput(false)] //避免Controller檢查Script攻擊
public JsonResult XXX_Edit()
{
try
{
string sMessage = string.Empty;
XXXHttpParam ap = new XXXHttpParam(this.HttpContext);
string sXXX_NO = ap.Param("txtXXX_NO");
var checkRow = db.XXX.FirstOrDefault(t => t.cXXX_NO == sXXX_NO && t.iXXX_RESULT == 1 );
//底下為驗證
if (checkRow != null && ap.boolParam("YesCheck"))
{
jResult.Data.status = "error";
jResult.Data.Message = string.Format("XXX資料重複,是否予以新增?");
return this.Json(jResult.Data);
}
int iXXX_PK = ap.IntParam("ID");
var eRow = db.XXX.FirstOrDefault(t => t.iXXX_PK == iXXX_PK);
if (eRow == null)
{
eRow = new XXX()
{
};
}
eRow.cXXX_NAME = ap.Param("txtXXX_NAME");
eRow.iXXX_UPD ="修改者";
eRow.dXXX_UPD = DateTime.Now;
//是新增或修改
db.Entry(eRow).State = (iXXX_PK == 0) ? EntityState.Added : EntityState.Modified;
db.SaveChanges();
return this.Json(jResult.Data);
}
catch (Exception ex)
{
CatchEvent(ex);
return this.Json(jResult.Data);
}
}