ASP.NET MVC使用带有Html.BeginForm的两个输入

时间:2011-02-10 04:11:18

标签: asp.net-mvc

是否有可能有两个输入或按钮控件,在绑定到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>         
    <% } %>

3 个答案:

答案 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()" />