MVC:返回View()返回到http ActionResult,而不是渲染View

时间:2017-01-04 22:35:59

标签: javascript c# asp.net-mvc asp.net-mvc-4 http-post

我有一张表格:

@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在控制器中验证而不是仅仅渲染视图?

2 个答案:

答案 0 :(得分:0)

这是因为您的表单发送回发请求并提交表单,您应该防止提交按钮的默认行为。 只需在javascript函数末尾添加event.preventDefaultreturn false

即可

答案 1 :(得分:0)

我认为这里发生的事情是您的表单被发布两次。

一旦通过Ajax调用,然后再通过标准提交输入。

一个简单的修复应该是添加return false,例如:

<input type="submit" value="Verify" onclick="checkValueVerify(); return false;" />

返回false是停止发布表单的提交输入,以便只发布Ajax函数。