我有一张表格:
@using (Html.BeginForm()){
<dl class="dl-horizontal">
<dt>@Html.LabelFor(m => m.VerifiedBy)<dt>
<dd>@Html.TextBoxFor(m => m.VerifiedBy)</dd>
</dl>
<input type="submit" value="Verify" onclick="checkValueVerify();" />
}
如果用户单击“验证”按钮而未输入“验证”的值,则JavaScript函数checkValueVerify将发送警报,然后指向HttpPost验证ActionResult。
JavaScript的:
function checkValueVerify() {
if (document.getElementById("verifiedBy").value== "") {
alert('Must enter name of verifier');
}
$.ajax({
url: '/GAC/Verify',
type: 'POST',
data: {'by': verifBy}
});
}
控制器:
[HttpPost]
public ActionResult Verify(GACVerifyViewModel viewModel,string by)
{
if(by==null)
{
//code
return View();
}
当我单步执行代码时,它从return View
转到Verify.cshtml到Layout.cshtml,这是我所期望的。但是,在Layout.cshtml的末尾,它会返回到[HttpPost] Verify
,此时我的参数为null。
所以流程是HttpPost验证 - &gt; Verify.cshtml - &gt; HttpPost验证(控制器 - &gt;视图 - &gt;控制器。 为什么回到我的HttpPost ActionResult在控制器中验证而不是仅仅渲染视图?
答案 0 :(得分:0)
这是因为您的表单发送回发请求并提交表单,您应该防止提交按钮的默认行为。
只需在javascript函数末尾添加event.preventDefault
或return false
答案 1 :(得分:0)
我认为这里发生的事情是您的表单被发布两次。
一旦通过Ajax调用,然后再通过标准提交输入。
一个简单的修复应该是添加return false,例如:
<input type="submit" value="Verify" onclick="checkValueVerify(); return false;" />
返回false是停止发布表单的提交输入,以便只发布Ajax函数。