Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC使用Html.NET的两个输入_Asp.net Mvc - Fatal编程技术网

Asp.net mvc ASP.NET MVC使用Html.NET的两个输入

Asp.net mvc ASP.NET MVC使用Html.NET的两个输入,asp.net-mvc,Asp.net Mvc,在绑定到Html.begin的同一个控制器中,是否可能有两个输入或按钮控件触发两个不同的操作 在下面的示例中,我希望Subscribe输入调用控制器上的Subscribe操作。这很有效。我希望取消订阅输入调用我的取消订阅操作。我该如何做到这一点?蒂亚 <% using (Html.BeginForm("Subscribe", "NewsLetter")) {%> <div class="editor-field">

在绑定到Html.begin的同一个控制器中,是否可能有两个输入或按钮控件触发两个不同的操作

在下面的示例中,我希望Subscribe输入调用控制器上的Subscribe操作。这很有效。我希望取消订阅输入调用我的取消订阅操作。我该如何做到这一点?蒂亚

<% 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>         
<% } %>
我希望可以从相同的表单元素调用每个动作,但这显然是错误的。我如何保持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>         
    <% } %>

时事通讯
输入您的电子邮件
型号.电子邮件地址)%>
型号.电子邮件地址)%>

您可以使用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处理程序添加到submit按钮,该按钮将调用javascript函数,然后将表单发布到正确的url。确保用表单元素的corect Id替换formId

<input type="submit" class="submit" value="Subscribe" onclick="Subscribe()" />
<input type="submit" class="submit" value="Unsubscribe" onclick="Unsubscribe()" />

一个HTML
表单
元素只有一个
动作
。因此,除非您的按钮使用JavaScript改变这一点,否则每个表单只能获得一个URI。您是否希望您的站点仅在启用JavaScript的情况下工作

另一个选项是给按钮一个
名称
,在这种情况下,您将获得
,作为已发布表单的一部分,例如:

<input type="submit" class="submit" name="newsletter" value="Subscribe" />
<input type="submit" class="submit" name="newsletter" value="Unsubscribe />

因为时事通讯是posted表单中的一个键,MVC将把它的值绑定到操作的参数。

或者使用RedirectToAction

   <%using(Html.BeginForm("RedirectingAction", "NewsLetter")){ %>

   <input type="submit" class="submit" name="newsletter" value="Subscribe" />
    <input type="submit" class="submit" name="newsletter" value="Unsubscribe" /> 
    <%} %>

不要那样做。您刚刚公开了一些操作,这些操作会改变HTTP GET上的服务器状态。如果您的会话在重定向过程中恰好过期,它们就会中断。无论他选择哪种解决方案,他都应该坚持一个帖子和一个请求,就像他问题中的代码一样。同意。现在的问题是根据我的理解提到了一个现有的取消订阅操作,因此重定向到操作。您的绑定和一切仍然可以在重定向操作上发生。感谢您的回答,但Craig说我应该注意这种方法。我将看看其他人有什么要说的,因为我还没有收到一个可以避免javascripting的有效解决方案。实际上,任何
GET
都是错误的,但是在重定向上执行它更糟糕。谢谢你的建议。我不想在这个阶段介绍jquery,如果我能侥幸成功的话。另外,您的建议将要求我的页面上有更多的代码,而不是控制器。通讯控制器中的“订阅”方法如下所示:public ActionResult Subscribe(通讯订阅者订阅)。根据你的推荐,如何通过NewsletteSubscriber实例将按钮名称传递到此方法中?
NewsletteSubscriber
类型需要具有与submit
input
name
属性同名的属性。如果需要添加其他信息,请编辑您的问题。
public ActionResult Subscribe(string newsletter)
{
    if ("subscribe".Equals(newsletter, StringComparison.OrdinalIgnoreCase))
    {
        //...
   <%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();
    }