是否有可能有两个输入或按钮控件,在绑定到Html.BeginForm的同一个控制器中触发两个不同的动作?
在以下示例中,我希望Subscribe输入在控制器上调用Subscribe action。这很好用。我希望取消订阅输入来调用我的取消订阅操作。我该如何实现这一目标? TIA。
<% using (Html.BeginForm("Subscribe", "NewsLetter"))
{%>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.EmailAdress) %>
<%= Html.ValidationMessageFor(
model => model.EmailAdress) %>
</div>
<div >
<input type="submit" class="submit" value="Subscribe" />
<input type="submit" class="submit" value="Unsubscribe" />
</div>
<% } %>
更新:
这个问题的更多背景信息:
My NewsLetterController有两个订阅订阅和取消订阅,如下所示:
public class NewsLetterController : Controller
{
[HttpPost]
public ActionResult Subscribe(NewsletterSubscriber subscriber)
{
// do something
}
[HttpPost]
public ActionResult Unsubscribe(NewsletterSubscriber subscriber)
{
// do something
}
我希望我可以从同一个Form元素中调用每个动作,但这显然是错误的。我如何仍然维护MVC模式,但如果可能,避免编写脚本?发布的HTML是主页上呈现的局部视图的一部分。
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl
<AkwiMemorial.Models.NewsletterSubscriber>" %>
<h2><strong>Newsletter</strong></h2>
<legend>Enter your email</legend>
<% using (Html.BeginForm("Subscribe", "NewsLetter"))
{%>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.EmailAdress) %>
<%= Html.ValidationMessageFor(model => model.EmailAdress) %>
</div>
<div >
<input type="submit" class="submit" name="sub"
value="Subscribe" />
<input type="submit" class="submit" name="unsub"
value="Unsubscribe" />
</div>
<% } %>
答案 0 :(得分:8)
HTML form
元素只有一个action
。因此,除非您的按钮使用JavaScript进行更改,否则每个表单只会获得一个URI。您是否希望您的网站仅使用JavaScript启用?
另一种选择是给按钮name
,在这种情况下,您将获得value
作为发布表单的一部分,例如:
<input type="submit" class="submit" name="newsletter" value="Subscribe" />
<input type="submit" class="submit" name="newsletter" value="Unsubscribe />
然后您可以使用单个操作来检查值,例如:
public ActionResult Subscribe(string newsletter)
{
if ("subscribe".Equals(newsletter, StringComparison.OrdinalIgnoreCase))
{
//...
因为newsletter
是已发布表单中的键,MVC会将其值绑定到操作的参数。
答案 1 :(得分:1)
或使用RedirectToAction
<%using(Html.BeginForm("RedirectingAction", "NewsLetter")){ %>
<input type="submit" class="submit" name="newsletter" value="Subscribe" />
<input type="submit" class="submit" name="newsletter" value="Unsubscribe" />
<%} %>
并在控制器中:
public ActionResult RedirectingAction()
{
TempData["Form"] = Request.Form;
return RedirectToAction(Request.Form["newsletter"].ToString());
}
public ActionResult Subscribe()
{
// Do stuff
return View();
}
public ActionResult Unsubscribe()
{
//Do something else
return View();
}
答案 2 :(得分:0)
您可以使用jquery完成此操作:
function Subscribe()
{
$.post(urlToSubscribeAction, $('#formId').serialize(), function () {// Do something after post});
return false;
}
function UnSubscribe()
{
$.post(urlToUnsubscribe, $('#formId').serialize(), function() { // Do something after post});
return false;
}
将onclick处理程序添加到将调用您的javascript函数的提交按钮,然后将表单的帖子发送到正确的URL。确保将formId替换为表单元素的corect Id。
<input type="submit" class="submit" value="Subscribe" onclick="Subscribe()" />
<input type="submit" class="submit" value="Unsubscribe" onclick="Unsubscribe()" />