2017-05-25 73 views
1

我正在使用.NET MVC爲新用戶創建一個IQ測試。目前,我有如下形式安裝後與數據庫:爲什麼不能輸入「提交」不適用於Form?

<div class="form-group"> 
    <input type="button" class="btn btn-default personality-finish-btn" value="send" /> 
</div> 

但對於引導驗證的原因,我需要切換爲type =「提交」,像這樣:

<div class="form-group"> 
    <input type="submit" class="btn btn-default personality-finish-btn" value="Submit" /> 
</div> 

當張貼通過點擊提交按鈕的形式,我與MVC長討厭的錯誤線沿線的:

「的參數字典包含參數無效項'非空類型的‘通行證System.Boolean’的方法'System.Threading.T在'TechAcademyLMS.Controllers.RegistrationController'中詢問[1] [System.Web.Mvc.JsonResult] PersonalityEvaluation(System.String,Boolean)'。可選參數必須是引用類型,可爲空類型,或者聲明爲可選參數。 參數名稱:參數'

這隻發生在從類型「按鈕」更改爲「提交」類型時。由於我不會在發佈邏輯中的任何位置調用按鈕,因此我相信這必須是內置的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 
    }); 
} 
+1

錯誤很明顯 - 您的提交按鈕調用'PersonalityEvaluation()'方法,該方法需要'bool',但是您不會將值傳遞給該參數。 –

+0

@StephenMuecke請參閱最新的答案。當它工作時,我一直在使用與之前相同的邏輯。我不知道我是否應該改變邏輯,但如果可能,我不想。 –

+0

因爲當你點擊按鈕時你不取消默認提交,所以你進行了正常的提交和ajax提交。但是,這有什麼意義呢 - 爲什麼在這個世界中,當你想在動作完成後重定向的時候使用ajax(使用ajax的全部重點就是保持在同一頁面上)。只需進行正常提交。 –

回答

2

按鈕類型不提交表單,但它運行您的JavaScript函數。提交類型的輸入實際上會提交包含輸入的表單。

如果你想運行JavaScript,但不希望提交表單使用的提交事件,然後取消默認行爲的形式,像這樣:

$(".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),這就是爲什麼您的布爾值始終爲空。

你最好的選擇是創建一個包裝兩個屬性的對象。喜歡的東西:

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

+0

這看起來與邏輯有關,我給了你一個加票。但是我仍然得到了不幸的同樣的錯誤。我嘗試在document.Ready()中包含checkPersonalityRadio(),但這不起作用。 –

0

託尼我在我的項目有這個錯誤很多時候看看併成功解決它。所以,如果你在錯誤仔細一看,上面寫着

「的參數字典包含參數無效項‘System.Boolean‘的方法’’非空類型的」通行證System.Threading.Tasks.Task '1 [系統。Web.Mvc.JsonResult] PersonalityEvaluation(System.String,Boolean)''在'TechAcademyLMS.Controllers.RegistrationController'中。可選參數必須是引用類型,可爲空類型,或者聲明爲可選參數。參數名:參數

說明:

我假設你有對PersonalityEvaluation()的參數如下圖所示:

PersonalityEvaluation(字符串somename,布爾somename)

所以錯誤說,我們將null值傳遞給bool參數,但同時我們將其指定爲非空值類型。

注意:無論您是從簡單視圖操作鏈接還是從ajax javascript發送參數,錯誤都將保持不變。

解決方案:

可以使這樣設置可空類型:

PersonalityEvaluation(字符串somename,布爾somename?)

或保證你alaways發送不含空參數使其成爲可空類型。對於字符串,我們沒有必要擔心它已經是一個可空type.so沒有問題.. :)

希望以上信息是有點用處,請讓我知道你的想法或反饋

感謝

Karthik

相關問題