2017-08-28 43 views
7

我正在使用一個asp.net webapi控制器,在我的項目中我有一個我自己構建的dll。該DLL正在用於驗證用戶是否正在輸入的人確實存在。使用自定義dll時AJAX錯誤沒有返回jqXHR.responseText.modelState

這裏是我的控制器方法:

// POST: api/EventsAPI 
[ResponseType(typeof(Event))] 
public IHttpActionResult PostEvent(Event @event) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    if (@event.DateEndOfEvent < @event.DateOfEvent) // successfully returns error.modelState (in view code) 
    { 
     ModelState.AddModelError("DateEndOfEvent", "End Date Cannot Be Before Start Date!"); 
     return BadRequest(ModelState); 
    } 

    if (!EmpData.IsValid(@event.PersonWorkedOne)) // returns error.modelState as undefined (in view code) 
    { 
     ModelState.AddModelError("PersonWorkedOne", "This person does not exist!"); 
     return BadRequest(ModelState); 
    } 

    if (!string.IsNullOrWhiteSpace(@event.PersonWorkedTwo)) 
    { 
     if (!EmpData.IsValid(@event.PersonWorkedTwo)) // returns error.modelState as undefined (in view code) 
     { 
      ModelState.AddModelError("PersonWorkedTwo", "This persondoes not exist!"); 
      return BadRequest(ModelState); 
     } 
    } 

    db.Event.Add(@event); 
    db.SaveChanges(); 

    return CreatedAtRoute("DefaultApi", new { id = @event.Id }, @event); 
} 

現在上述兩個條件語句有EmpData ... EmpData是從我的DLL。

這是在我看來,Ajax代碼:

$("form").data("validator").settings.submitHandler = 
    function(form) { 
     $.ajax({ 
      method: "POST", 
      url: infoGetUrl, 
      data: $("form").serialize(), 
      success: function() { 
       toastr.options = { 
        onHidden: function() { 
         window.location.href = newUrl; 
        }, 
        timeOut: 3000 
       } 
       toastr.success("Event successfully created."); 
      }, 
      error: function (jqXHR, textStatus, errorThrown) { 
       var status = capitalizeFirstLetter(textStatus); 
       var error = $.parseJSON(jqXHR.responseText); 

       var modelState = error.modelState; 
       console.log(modelState); 
       $.each(modelState, 
        function (key, value) { 
         var id = ""; 
         if (key === "$id") { 
          id = "#" + 
           key.replace('$', '').substr(0, 1).toUpperCase() + 
           key.substr(2); 
         } else { 
          id = "#" + 
           key.replace('$', '').substr(0, 1).toUpperCase() + 
           key.substr(1); 
          var status = capitalizeFirstLetter(textStatus); 
          console.log(key); 

          toastr.error(status + " - " + modelState[key]); 
         } 
         var input = $(id); 
         console.log(id); // result is #id 
         if (input) { // if element exists 
          input.addClass('input-validation-error'); 
         } 
        }); 
      } 
     }); 
    } 

現在,當我故意測試得到錯誤信息concering結束日期爲起始日期之前的控制器,我收到error.modelState。但是,當我有目的地測試以獲得錯誤消息說某人不存在...我沒有得到error.modelState ..返回爲undefined

使用自定義DLL時返回的ModelState不起作用嗎?

任何幫助表示讚賞。

+0

你爲什麼返回每個驗證檢查中的反應?這樣一來,調用者只能一個一個地單調地找出哪些字段是無效的。在每個if語句中添加模型狀態會更方便調用,如果ModelState.IsValid爲false(也就是在至少一個錯誤)。然後,如果多個字段無效,調用者將立即看到它們。 – ADyson

+0

它還可以對您的問題進行更復雜的測試,從而可以爲事件_and_人員字段發送無效數據,並查看您是否仍然收到模型狀態。沒有理由我想到爲什麼在庫中調用代碼會導致模型狀態不出現。更可能的解釋是,EmpData.IsValid在不應該時返回true,並且由於其他原因(不返回modelState)導致您的調用失敗。如果a)HTTP狀態爲400,並且b)您實際上在響應中發送了一個modelState,則只會獲得一個modelState。 – ADyson

+0

當你對一個無效人員進行測試時,你的HTTP響應代碼肯定是400?你是否已經通過代碼來驗證它確實進入了'if(!EmpData.IsValid(@ event.PersonWorkedOne))'或'if(!EmpData.IsValid(@ event.PersonWorkedTwo))'塊,並且確實返回內部的行?如果是這樣,那麼在'return'語句中暫停並在那個時候檢查服務器端的modelState的值 - 這是您的期望嗎?你有沒有在瀏覽器中檢查你的網絡標籤來檢查實際的響應,而不僅僅是jQuery的輸出? – ADyson

回答

6

我能夠在ADyson的幫助下計算出來。我編輯我的DLL文件,只返回一個布爾對象。

本來,如果我在IsValid檢查的東西不是真的,那麼我會拋出一個異常導致這個錯誤。

所以把異常部分拿出來,只是返回true或false都起作用。

原始

public static bool IsValid(string person) 
{ 
    bool empExists = lstAllEmps.Any(x => x.IDNumber == person); 

    if (empExists) 
    { 
     return empExists; 
    } 
    else 
    { 
     var exceptionMessage = string.Format("The person, {0}, does not exist!", person); 
     throw new ArgumentException(exceptionMessage, person); 
    } 
} 

public static bool IsValid(string person) 
{ 
    bool empExists = lstAllEmps.Any(x => x.IDNum == person); 


    return empExists; 
} 
+1

是的,拋出一個異常會做到這一點,因爲正常的執行流程將停止,服務器可能會返回一個500內部服務器錯誤。很高興你想出來了。 – ADyson

+2

你應該認識到,既然這是「正確的」答案,那麼你的問題就會出現問題,因爲我們一直都無法弄清楚你正在拋出異常。下次請遵循[MCVE]指南。 –

相關問題