Asp.net mvc 如何在asp.net mvc视图中仅执行一个表单操作方法?
我有一个包含两个表单的页面,一个存在于布局文件中,另一个存在于视图文件中。第一个表单用于新闻稿订阅(ajax表单),它的位置在页面的页脚中很常见,这就是为什么它在布局中,并作为局部视图呈现的原因。我有另一个联系我们页面的视图,它有自己的表单(普通表单)。 我的问题是,当我提交contact us表单时,代码也会进入订阅表单的action方法,并返回一个带有JsonResult的模型错误,导致整个视图呈现为文本。我只希望执行联系我们表单的操作方法 这是部分视图文件中的订阅表单Asp.net mvc 如何在asp.net mvc视图中仅执行一个表单操作方法?,asp.net-mvc,Asp.net Mvc,我有一个包含两个表单的页面,一个存在于布局文件中,另一个存在于视图文件中。第一个表单用于新闻稿订阅(ajax表单),它的位置在页面的页脚中很常见,这就是为什么它在布局中,并作为局部视图呈现的原因。我有另一个联系我们页面的视图,它有自己的表单(普通表单)。 我的问题是,当我提交contact us表单时,代码也会进入订阅表单的action方法,并返回一个带有JsonResult的模型错误,导致整个视图呈现为文本。我只希望执行联系我们表单的操作方法 这是部分视图文件中的订阅表单 @model MyA
@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" />
}
@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>
}
这是contactus视图文件中的另一个表单
@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" />
}
@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);
}
我尝试了两种解决方案,第一种部分解决了问题,另一种完全解决了问题 第一个解决方案是在订阅表单的操作方法中添加以下行
if (!Request.IsAjaxRequest())
{
ModelState.Clear();
return PartialView("Partial/_NewsletterSubscription");
}
这里我检查请求是否不是ajax请求,这意味着它是contact-us表单的回发请求,在本例中,我清除模型状态以删除错误并返回新的部分视图。虽然这个解决方案解决了这个问题,但我并不满意,因为我不相信订阅表单的操作方法是通过联系我们表单的操作方法执行的
所以后来我想到了另一个简单的解决方案,它完全解决了这个问题,在提交联系我们表单时,执行不会进入订阅表单的操作方法。
我只是简单地将操作方法的名称从“newslettesubscription”改为“Subscribe”,从而代替了
@using (Ajax.BeginForm("NewsletterSubscription", "Shared", null, new AjaxOptions
我把它改成了
@using (Ajax.BeginForm("Subscribe", "Shared", null, new AjaxOptions
是否确定布局表单未在联系人表单中呈现?首先检查页面的视图源以确保表单没有嵌套。我已经检查过表单没有嵌套,两个表单都正确呈现,中间有其他html元素。嗯,在这种情况下,可能是一些JavaScript正在这样做。你是否在任何js中使用这些表单元素作为单独的id?不,我没有在任何js中使用它们,起初我没有为表单分配任何id,然后我认为这可能是导致问题的原因,可能是如果有多个表单,那么每个表单都应该有一个id,但当我添加它们时,没有任何更改,我得到了相同的行为。