我正在使用一個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不起作用嗎?
任何幫助表示讚賞。
你爲什麼返回每個驗證檢查中的反應?這樣一來,調用者只能一個一個地單調地找出哪些字段是無效的。在每個if語句中添加模型狀態會更方便調用,如果ModelState.IsValid爲false(也就是在至少一個錯誤)。然後,如果多個字段無效,調用者將立即看到它們。 – ADyson
它還可以對您的問題進行更復雜的測試,從而可以爲事件_and_人員字段發送無效數據,並查看您是否仍然收到模型狀態。沒有理由我想到爲什麼在庫中調用代碼會導致模型狀態不出現。更可能的解釋是,EmpData.IsValid在不應該時返回true,並且由於其他原因(不返回modelState)導致您的調用失敗。如果a)HTTP狀態爲400,並且b)您實際上在響應中發送了一個modelState,則只會獲得一個modelState。 – ADyson
當你對一個無效人員進行測試時,你的HTTP響應代碼肯定是400?你是否已經通過代碼來驗證它確實進入了'if(!EmpData.IsValid(@ event.PersonWorkedOne))'或'if(!EmpData.IsValid(@ event.PersonWorkedTwo))'塊,並且確實返回內部的行?如果是這樣,那麼在'return'語句中暫停並在那個時候檢查服務器端的modelState的值 - 這是您的期望嗎?你有沒有在瀏覽器中檢查你的網絡標籤來檢查實際的響應,而不僅僅是jQuery的輸出? – ADyson