[英]Why won't type “submit” not work with Form?
我正在使用.NET MVC為新用戶創建IQ測試。 當前,我有表單設置要發布到數據庫:
<div class="form-group">
<input type="button" class="btn btn-default personality-finish-btn" value="send" />
</div>
但是出於引導驗證的原因,我需要像這樣切換到type =“ submit”:
<div class="form-group">
<input type="submit" class="btn btn-default personality-finish-btn" value="Submit" />
</div>
通過單擊提交按鈕發布表單時,我在MVC上遇到了一個很討厭的錯誤:
“參數字典包含用於方法'System.Threading.Tasks.Task`1 [System.Web.Mvc.JsonResult] PersonalityEvaluation(System.String,布爾)”中的“ TechAcademyLMS.Controllers.RegistrationController”。 可選參數必須是引用類型,可為空的類型,或者必須聲明為可選參數。 參數名稱:參數'
這僅在從“按鈕”類型更改為“提交”類型時發生。 由於我不在發布邏輯中的任何位置調用按鈕,因此我確信這一定是內置HTML問題。
任何線索將不勝感激,謝謝。
編輯:
這是我一直在使用的當前驗證邏輯。 我以前從未使用過bool,所以我不知道為什么現在需要:
$(document).ready(function () {
$(".personality-finish-btn").on("click", function () {
checkPersonalityRadio();
})
})
function checkPersonalityRadio() {
var pass = false;
var score = 0;
for (var i = 1; i < 51; i++) {
var value = $("input[name='eval-checkbox-" + i + "']:checked").val();
if (value !== undefined) {
score += parseInt(value);
}
};
if (score >= 35 && 50) {
score += " Pass";
pass = true;
} else if (score <= 34){
score += " Fail";
}
score = JSON.stringify(score);
$.ajax({
type: "POST",
url: "/Registration/PersonalityEvaluation",
data: { score: score, pass: pass },
success: function (response) {
window.location.href = "/Registration/StepTwelve";
},
dataType: "json",
error: function () {
console.log(data);
alert("Whoops, something went wrong.");
},
traditional: true
});
}
按鈕類型不會提交表單,但會運行您的javascript函數。 類型為commit的輸入實際上會提交包含該輸入的表單。
如果您想運行javascript但又不想提交表單,請使用Submit事件,然后取消默認的表單行為,如下所示:
$(".personality-finish-btn").on("submit", function () {
checkPersonalityRadio(); // here you can send you details to API controller by Ajax.
return false; //this will avoid the default form behaviour, which is being submitted.
})
更新:我認為您的問題是您試圖在POST提交中發送兩個參數。 ModelBinder嘗試將這些參數映射到對象,因此它可能正在嘗試將所有參數分配給PersonalityEvaluation(System.String,Boolean)中的字符串,這就是布爾值始終為null的原因。
最好的選擇是創建一個包裝兩個屬性的對象。 就像是:
public class TestResults(){
public string score {get; set;}
public bool pass {get; set;}
}
因此,控制器中的操作方法如下所示:
public PersonalityEvaluation(TestResults results){
//your logic here
}
看一下此鏈接http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
Tony我的項目中多次發生此錯誤,並成功解決了該錯誤。 因此,如果您仔細查看錯誤,它會說
“參數字典包含參數提供一個空條目‘System.Boolean’非空類型的‘通’的方法” System.Threading.Tasks.Task`1 [System.Web.Mvc.JsonResult] PersonalityEvaluation(System.String,布爾)”中的“ TechAcademyLMS.Controllers.RegistrationController”。 可選參數必須是引用類型,可為空的類型,或者必須聲明為可選參數。 參數名稱:參數'
說明:
我假設您具有如下的PersonalityEvaluation()參數:
PersonalityEvaluation(String somename,Bool somename)
因此錯誤表明,我們正在將null值傳遞給bool參數,但同時我們將其指定為非null類型。
注意:無論是從簡單視圖操作鏈接還是從ajax javascript發送參數的地方,錯誤都將保持不變。
解:
您可以將參數設置為可空類型,如下所示:
PersonalityEvaluation(String somename,Bool?somename)
或確保您始終發送不帶null的參數,以使其成為可空類型。 對於字符串,我們不必擔心它已經是可為null的類型。所以沒問題.. :)
希望以上信息對您有所幫助,請讓我知道您的想法或反饋
謝謝
KARTHIK
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.