为什么不输入"提交"不使用表单?

时间:2017-05-25 23:14:35

标签: c# html asp.net-mvc forms twitter-bootstrap

我正在使用.NET MVC为新用户创建IQ测试。目前,我已将表单设置发布到数据库:

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

但是出于引导验证的原因,我需要切换到type =&#34;提交&#34;像这样:

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

通过单击提交按钮发布表单时,我在MVC中遇到了一个长期令人讨厌的错误:

  

&#39;参数字典包含参数&#39; pass&#39;的空条目。非可空类型&#39; System.Boolean&#39; for method&Th; System.Threading.Tasks.Task`1 [System.Web.Mvc.JsonResult] PersonalityEvaluation(System.String,Boolean)&#39; in&#39; TechAcademyLMS.Controllers.RegistrationController&#39;。可选参数必须是引用类型,可空类型,或者声明为可选参数。   参数名称:参数&#39;

仅在更改类型&#34;按钮&#34;输入&#34;提交&#34;。由于我没有在发布逻辑中的任何位置调用按钮,因此我确信这必须是内置的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
    });
}

2 个答案:

答案 0 :(得分:2)

按钮类型不提交表单,但它运行您的javascript函数。类型提交的输入实际上提交了包含输入的表单。

如果您想运行javascript但不想提交表单,请使用submit事件,然后取消默认表单行为,如下所示:

In [669]: A.reshape(-1,A.shape[-1])[B.ravel()].reshape(3,5,4)
Out[669]: 
array([[[ 0.1 ,  0.91,  0.1 ,  0.98],
        [ 0.1 ,  0.91,  0.1 ,  0.98],
        [ 0.1 ,  0.91,  0.1 ,  0.98],
        [ 0.45,  0.16,  0.02,  0.02],
        [ 0.1 ,  0.91,  0.1 ,  0.98]],

       [[ 0.45,  0.16,  0.02,  0.02],
        [ 0.48,  0.6 ,  0.96,  0.21],
        [ 0.48,  0.6 ,  0.96,  0.21],
        [ 0.1 ,  0.91,  0.1 ,  0.98],
        [ 0.45,  0.16,  0.02,  0.02]],

       [[ 0.48,  0.6 ,  0.96,  0.21],
        [ 0.45,  0.16,  0.02,  0.02],
        [ 0.48,  0.6 ,  0.96,  0.21],
        [ 0.45,  0.16,  0.02,  0.02],
        [ 0.45,  0.16,  0.02,  0.02]]])

更新: 我认为您的问题是您尝试在POST提交中发送两个参数。 ModelBinder尝试将这些参数映射到一个对象,因此它可能会尝试将所有参数分配给 PersonalityEvaluation(System.String,Boolean)中的字符串,这就是为什么你的布尔值总是为空。

您最好的选择是创建一个包装两个属性的对象。类似的东西:

$(".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.
})

所以你的控制器中的动作方法看起来像是:

public class TestResults(){
    public string score {get; set;}
    public bool pass {get; set;}
}

请查看此链接http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

答案 1 :(得分:0)

Tony我在项目中多次出现此错误并成功解决了。所以,如果仔细观察错误,就说

'参数字典包含一个 null条目,用于参数'pass'的非可空类型'System.Boolean',用于方法'System.Threading.Tasks.Task`1 [System.Web。 Mvc.JsonResult] PersonalityEvaluation(System.String,Boolean)'在'TechAcademyLMS.Controllers.RegistrationController'中。可选参数必须是引用类型,可空类型,或者声明为可选参数。参数名称:参数'

<强>解释

我假设您正在使用PersonalityEvaluation()的参数,如下所示:

PersonalityEvaluation(String somename,Bool somename)

所以错误说,我们将null值传递给bool参数,但同时我们指定为非可空类型。

注意:无论您从简单视图操作链接还是从ajax javascript发送参数,错误都将保持不变。

<强>溶液

您可以将参数设为可为空类型,如下所示:

PersonalityEvaluation(String somename,Bool?somename)

或确保您是alaways发送参数而不使用null alaways以使其成为可空类型。对于一个字符串我们不用担心它已经是一个可以为空的类型了。所以没问题.. :)

希望以上信息有用,请让我知道您的想法或反馈

由于

KARTHIK