如何在asp.net mvc视图中只执行一个表单操作方法?

时间:2015-02-08 15:20:30

标签: asp.net-mvc

我有这个页面包含2个表单,一个存在于布局文件中,另一个存在于视图文件中。第一种形式是订阅时事通讯(ajax形式),它的位置在页面的页脚中很常见,这就是它在布局中的原因并呈现为部分视图。我有另一种联系我们页面的视图,它有自己的表格(普通表格)。 我的问题是,当我提交联系我们表单时,代码也会进入订阅表单的action方法,并返回JsonResult的模型错误,导致整个视图呈现为文本。我只想要联系我们表格的行动方法来执行。

以下是部分视图文件中的订阅表单

@model MyApp.Models.Subscriber
@using (Ajax.BeginForm("NewsletterSubscription", "Shared", null, new AjaxOptions
    {
        HttpMethod = "POST",
        OnBegin = "OnBegin",
        OnComplete = "OnComplete",
        OnFailure = "OnFailure"
    }, new { id = "subscribeForm" }))
    {
        @Html.AntiForgeryToken()
        @Html.TextBoxFor(model => model.SubscriptionEmail)
        @Html.ValidationMessageFor(model => model.SubscriptionEmail)
        <input id="btnSubscribe" type="submit" value="Subscribe" />
    }

这就是它在_layout.cshtml文件中的呈现方式

@{ Html.RenderAction("NewsletterSubscription", "Shared"); }

这是联系人视图文件中的另一种形式

@using (Html.BeginForm("Index", "Contact", FormMethod.Post, new { id = "contactForm" }))
     {
        @Html.AntiForgeryToken()
         <div class="theForm">
             <div class="theFormUnit">
                 <p>Fullname</p>
                 @Html.TextBoxFor(model => model.Name)
                 @Html.ValidationMessageFor(model => model.Name)
             </div>
             <div class="theFormUnit">
                 <p>Email</p>
                 @Html.TextBoxFor(model => model.Email)
                 @Html.ValidationMessageFor(model => model.Email)
             </div>
             <div class="theFormUnit">
                 <p>Phone</p>
                 @Html.TextBoxFor(model => model.Phone)
                 @Html.ValidationMessageFor(model => model.Phone)
             </div>
             <div class="theFormUnit">
                 <p>Message</p>
                 @Html.TextAreaFor(model => model.Message)
                 @Html.ValidationMessageFor(model => model.Message)
             </div>
             <input type="submit" value="Submit" />
        </div>
     }

当我调试代码时,首先执行联系我们的操作方法,然后执行订阅的操作方法,并返回错误,因为未提供电子邮件。

订阅操作方法

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult NewsletterSubscription(Subscriber subscriber)
{
    if (ModelState.IsValid)
    {
    }
    else
    {
       return Json(new { success = false, message = "Failure Message" });
    }

    return Json(new { success = true, message = "Success Message"}); 
}

并与我们联系行动方法

[HttpPost]
[ValidateAntiForgeryToken]
 public ActionResult Index(ContactViewModel contact)
 {
    if(ModelState.IsValid)
    {
    }
    else
    {
    }
    return View(contact);
}

1 个答案:

答案 0 :(得分:0)

我尝试了两个解决方案,第一个解决了问题,另一个解决了问题。

首先解决方案是在订阅表单的操作方法中添加以下行

if (!Request.IsAjaxRequest())
{
 ModelState.Clear();
 return PartialView("Partial/_NewsletterSubscription");
}

这里我正在检查请求是否不是ajax请求,这意味着它是联系我们表单的回发请求,在这种情况下我清除模型状态以删除错误并返回一个新的局部视图。虽然这个解决方案解决了这个问题,但我对此并不满意,因为我不相信订阅表单的动作方法是用联系我们表单的动作方法执行的。

所以后来我想到了另一个简单的解决方案,它完全解决了问题,并且在提交联系我们表单时执行不会进入订阅表单的操作方法。 我只是从&#34; NewsletterSubscription&#34;更改了操作方法名称。到&#34;订阅&#34;所以而不是

@using (Ajax.BeginForm("NewsletterSubscription", "Shared", null, new AjaxOptions

我把它改成了

@using (Ajax.BeginForm("Subscribe", "Shared", null, new AjaxOptions