Asp.net mvc ASP.NET MVC使用Html.NET的两个输入
在绑定到Html.begin的同一个控制器中,是否可能有两个输入或按钮控件触发两个不同的操作 在下面的示例中,我希望Subscribe输入调用控制器上的Subscribe操作。这很有效。我希望取消订阅输入调用我的取消订阅操作。我该如何做到这一点?蒂亚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">
<% 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
类型需要具有与submitinput
的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();
}