iT邦幫忙

0

asp.net 的自訂驗證

最近在學 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,傳給前端嗎?

0
攻城屍
iT邦新手 5 級 ‧ 2018-10-08 09:21:42
if (!ModelState.IsValid)
{
    var errorMsg = ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage);
    return Json(errorMsg);
}
Brandon iT邦新手 4 級 ‧ 2018-10-08 09:50:45 檢舉

您好,我知道這個方法,但這個方法只能得到個別欄位的驗證結果。我要的是類別的驗證結果(跨欄位的)。謝謝。

0
優悠
iT邦新手 5 級 ‧ 2018-10-08 09:24:16

取得JQGRID部分程式碼
https://ithelp.ithome.com.tw/upload/images/20181008/20108584mekr6V5k8U.jpg

因私密關係,簡陋了點

https://ithelp.ithome.com.tw/upload/images/20181008/20108584wFQWeEvTI8.jpg

[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);
            }
        }
看更多先前的回應...收起先前的回應...
Brandon iT邦新手 4 級 ‧ 2018-10-08 09:53:05 檢舉

不好意思,你的回答似乎不是給這一題的?

優悠 iT邦新手 5 級 ‧ 2018-10-08 10:13:23 檢舉

你這是儲存資料,然後順便驗證下,用AJAX傳資料,最後傳出錯誤提示或儲存成功,開頭結尾可以參考我擷取的程式碼。
不然我再擷取一個好了。

優悠 iT邦新手 5 級 ‧ 2018-10-08 10:38:20 檢舉

你再看看,不行可能我資料提供錯誤,我再刪文。

Brandon iT邦新手 4 級 ‧ 2018-10-08 18:17:11 檢舉

其實我原本的寫法也跟你一樣,在Controller中做Validate。但我想學的是,就是不要在Controller中做Validate,而是在Model中做。

0
Homura
iT邦研究生 2 級 ‧ 2018-10-09 09:26:07
Brandon iT邦新手 4 級 ‧ 2018-10-09 09:49:47 檢舉

你好,是ViewModel驗證模型沒錯。我的問題是,有可能在Controller中接到 ValidateResult 嗎?

Homura iT邦研究生 2 級 ‧ 2018-10-09 14:22:27 檢舉

.

我要發表回答

立即登入回答