2016-01-20 55 views
1

如果表单未经验证,如何阻止将模型发送到控制器?如何防止将数据传递到控制器

剃刀

@using (Html.BeginForm("Login", "Login", FormMethod.Post)) 
{ 
    <div> 
     <div class="form-group input-group"> 
      <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span> 
      @Html.TextBoxFor(model => model.AccountName, new { @id = "accountNameText", @class = "form-control", @placeholder = "Account name" }) 
     </div> 
     <div class="form-group input-group"> 
      <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span> 
      @Html.TextBoxFor(model => model.Password, new { @id = "accountPasswordText", @class = "form-control", @placeholder = "Password" }) 
     </div> 
     <div class="form-group"> 
      <button type="submit" class="btn btn-success btn-block" onclick="valideLogin()">Login</button> 
     </div> 
     <span id="loginStatusMessege" style="color: red"> 

     </span> 
    </div> 
} 

的jQuery

function valideLogin() { 
    var accName = $('#accountNameText'); 
    var accPass = $('#accountPasswordText'); 

    if (accName.val() === '' || accName.val() === '') { 
     $('#loginStatusMessege').html('Account name and password cannot be blank.'); 
    } 
} 

之后,我按下登录按钮和文本框没有填写,代码成功地进入jQuery和有关错误的反应,但仍然,每次我正在进入控制器。我如何防止此操作?

回答

2

尝试return false;加入:

function valideLogin() { 
    var accName = $('#accountNameText'); 
    var accPass = $('#accountPasswordText'); 

    if (accName.val() === '' || accName.val() === '') { 
     $('#loginStatusMessege').html('Account name and password cannot be blank.'); 
     return false; 
    } 
} 
4

指定一个标识符的形式有效的它提交事件处理程序。

@using (Html.BeginForm("Login", "Login", FormMethod.Post, new { @id = "myForm")){ 
} 

绑定使用jQuery提交事件,在事件处理程序使用event.preventDefault()取消形式的默认操作时,不符合条件。

$("#myForm").submit(function(event){ 
    var accName = $('#accountNameText'); 
    var accPass = $('#accountPasswordText'); 

    if (accName.val() === '' || accName.val() === '') { 
     $('#loginStatusMessege').html('Account name and password cannot be blank.'); 
     event.preventDefault(); 
    } 
}) 
+0

:)用于提示'event.preventDefault()'而不是'返回false'。 – Rohit416

+0

总的来说最好的答案,但你应该总是使用'on'(即'.on('submit',function(){...}')而不是像'submit'这样的事件特定的方法,后者已经被弃用。 –

0

您需要将验证添加到您的代码或使用Ajax.BeginForm或两者。 当你使用Html.BeginForm这将直接进入控制器,并会忽略你的jQuery.JavaScript。

你需要看一个很好的教程。例如here

0

如果你坚持使用jQuery/Javascript来验证您的形式,只是消费的形式,稍微改变了你的valideLogin功能:

function valideLogin() { 
    var accName = $('#accountNameText'); 
    var accPass = $('#accountPasswordText'); 
    return accName.val() !== '' && accPass.val() !== ''; 
} 

然后,click事件侦听器添加到您的提交按钮像这样:

$('#submitButton').click(function(event) { 
    if (!valideLogin()) { 
     event.preventDefault(); 
    } 
} 

这是做什么的:它消耗你点击提交按钮事件。

P.S:在您提供的代码示例中,检查accName是否为空两次。在我的示例中为您检查accNameaccPass的更改。

+1

它总是更好的绑定提交事件与表单,因为你也可以通过在文本框中使用'enter'键来提交它,在这种情况下你的方法永远不会被调用。 – Satpal

+0

@Satpal:在这里,'click'被绑定到提交按钮,而不是表单,提交按钮会在按钮的任何激活时触发'click',不管是通过实际的鼠标点击还是按回车。然而,我同意最好绑定到表单的'submit'事件,一般来说,在做表单验证时。 –

1

您可以防止使用return语句是这样的:

function valideLogin() { 
    var accName = $('#accountNameText'); 
    var accPass = $('#accountPasswordText'); 

    if (accName.val() === '' || accName.val() === '') { 
     $('#loginStatusMessege').html('Account name and password cannot be blank.'); 
    return; 
    } 
} 
0

jQuery中:

if (accName.val() === '' || accName.val() === '') { 
    $('#loginStatusMessege').html('Account name and password cannot be blank.'); 
return false; 
} 

在标记:

<button type="submit" class="btn btn-success btn-block" onclick="return valideLogin();">Login</button> 

这里是我测试的代码:

标记:

@using (Html.BeginForm("Test", "Home")) 
{ 
    <div> 

     <div class="form-group"> 
      <button type="submit" class="btn btn-success btn-block" onclick="return Test();">Login</button> 
     </div> 
     <span id="loginStatusMessege" style="color: red"> 

     </span> 
    </div> 
} 

的Javascript:

function Test() { 
    return false; 
} 

这将永远不会在控制器的行动中的JavaScript始终返回false。

0

只需在if条件下使用return false;,即可防止调用控制器。

相关问题