Asp.net mvc ASP.NET MVC ActionLink和post方法

Asp.net mvc ASP.NET MVC ActionLink和post方法,asp.net-mvc,actionlink,Asp.net Mvc,Actionlink,有人能告诉我如何使用ActionLink和POST方法向Controller提交值吗? 我不想使用按钮。 我猜它与jquery有关。如果您有自定义数据,它将起作用。如果您想发布现有表单,它更易于使用 而且您不必在ActionLink本身中设置此代码,因为您可以在document.ready()事件中附加链接处理程序(无论如何这是首选方法),例如使用$(function(){…})jQuery技巧。你不能使用ActionLink,因为它只是呈现一个锚 或者只需调用表单的submit方法,使用jQu

有人能告诉我如何使用ActionLink和POST方法向Controller提交值吗?
我不想使用按钮。
我猜它与jquery有关。

如果您有自定义数据,它将起作用。如果您想发布现有表单,它更易于使用


而且您不必在
ActionLink
本身中设置此代码,因为您可以在
document.ready()
事件中附加链接处理程序(无论如何这是首选方法),例如使用
$(function(){…})
jQuery技巧。

你不能使用
ActionLink
,因为它只是呈现一个锚


或者只需调用表单的submit方法,使用jQuery或不使用jQuery(这将是非AJAX的),可能是在您喜欢的任何控件的
onclick
事件中。

使用以下调用操作链接:

<%= Html.ActionLink("Click Here" , "ActionName","ContorllerName" )%>

要提交表单值,请使用:

 <% using (Html.BeginForm("CustomerSearchResults", "Customer"))
   { %>
      <input type="text" id="Name" />
      <input type="submit" class="dASButton" value="Submit" />
   <% } %>


它将向客户控制器和客户搜索结果操作提交数据。

ActionLink将永远不会启动post。它总是触发GET请求。

如果您使用的是ASP MVC3,您可以使用Ajax.ActionLink(),它允许您指定一个可以设置为“POST”的HTTP方法。

我建议保持纯REST原则,并使用HTTP delete进行删除。不幸的是,HTML规范只有HTTPGET&Post。标记只能由HTTP获取。表单标记可以执行HTTP Get或Post。幸运的是,如果您使用ajax,您可以执行HTTP删除,这就是我的建议。有关详细信息,请参阅以下帖子:

在Ajax.begin中使用此链接

@Html.ActionLink(
    "Save", 
    "SaveAction", 
    null, 
    null, 
    onclick = "$(this).parents('form').attr('action', $(this).attr('href'));$(this).parents('form').submit();return false;" })

)()

我对这个问题的解决方案相当简单。我有一个页面,一个通过整个电子邮件进行客户搜索,另一个通过部分进行搜索,部分拉取并显示一个列表该列表有一个操作链接,指向名为GetByID的actionresult并传入id

GetByID提取所选客户的数据,然后返回

return View("Index", model); 

这是一个很难解决的问题。如何在razor和html中构建一个动态链接,以调用一个操作方法并将一个或多个值传递给特定的操作方法?我考虑了几个选项,包括自定义html助手。我刚刚想出了一个简单而优雅的解决方案

景色

@model IEnumerable<MyMvcApp.Models.Product>

@using (Html.BeginForm()) {

     <table>
         <thead>
             <tr>
                 <td>Name</td>
                 <td>Price</td>
                 <td>Quantity</td>
            </tr>
        </thead>
        @foreach (Product p in Model.Products)
        {
            <tr>
                <td><a href="@Url.Action("Edit", "Product", p)">@p.Name</a></td>
                <td>@p.Price.ToString()</td>
                <td>@p.Quantity.ToString()</td>
            </tr>
         }
    </table>
}
这里的要点是Url.Action不关心Action方法是GET还是POST。它将访问任一类型的方法。您可以使用将数据传递给操作方法

@Url.Action(string actionName, string controllerName, object routeValues)

routeValues对象。我已经试过了,而且效果很好。不,从技术上讲,您并不是在发布或提交表单,但是如果routeValues对象包含您的数据,那么它是发布还是获取都无关紧要。您可以使用特定的操作方法签名来选择正确的方法。

您可以使用jQuery为所有按钮进行发布。只要给他们一个相同的CssClass名称

如果要在发布后执行服务器端重定向操作,请在onclick javascript事件结束时使用“return false;”,否则只需返回视图

剃刀代码

@using (Html.BeginForm())
{
    @Html.HiddenFor(model => model.ID) 
    @Html.ActionLink("Save", "SaveAction", "MainController", null, new { @class = "saveButton", onclick = "return false;" })
}
JQuery代码

$(document).ready(function () {
        $('.saveButton').click(function () {
            $(this).closest('form')[0].submit();
        });
    });
C#


@艾多斯得到了正确的答案,只是想澄清一下,因为它隐藏在@CodingWithSpike对其帖子的评论中

@Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" })

我使用以下代码完成了相同的问题:

@using (Html.BeginForm("Delete", "Admin"))
{
       @Html.Hidden("ProductID", item.ProductID)
       <input type="submit" value="Delete" />
}
@使用(Html.BeginForm(“删除”、“管理”))
{
@Html.Hidden(“ProductID”,item.ProductID)
}
调用$.post()将不起作用,因为它是基于Ajax的。因此,为此需要使用一种混合方法

以下是对我有效的解决方案

步骤: 1.为href创建URL,该href使用URL和参数调用a方法 2.使用JavaScript方法调用普通POST

解决方案:

在.cshtml中:

<a href="javascript:(function(){$.postGo( '@Url.Action("View")', { 'id': @receipt.ReceiptId  } );})()">View</a>
postGo在JavaScript中定义如下。 其余的都很简单

@Url.Action(“View”)为调用创建Url

{'id':@receipt.ReceiptId}将参数创建为对象,然后在postGo方法中将其转换为POST字段。这可以是您需要的任何参数

在JavaScript中:

(function ($) {
    $.extend({
        getGo: function (url, params) {
            document.location = url + '?' + $.param(params);
        },
        postGo: function (url, params) {
            var $form = $("<form>")
                .attr("method", "post")
                .attr("action", url);
            $.each(params, function (name, value) {
                $("<input type='hidden'>")
                    .attr("name", name)
                    .attr("value", value)
                    .appendTo($form);
            });
            $form.appendTo("body");
            $form.submit();
        }
    });
})(jQuery);
(函数($){
$扩展({
getGo:函数(url、参数){
document.location=url+'?'+$.param(params);
},
postGo:函数(url、参数){
变量$form=$(“”)
.attr(“方法”、“职位”)
.attr(“操作”,url);
$.each(参数、函数(名称、值){
$("")
.attr(“名称”,名称)
.attr(“值”,值)
.附录($表格);
});
$form.appendTo(“正文”);
$form.submit();
}
});
})(jQuery);
我用于postGo的参考URL


这是我解决这个问题的方法。 这是一个具有2种动作方法的控制器

public class FeedbackController : Controller
{
public ActionResult Index()
{
   var feedbacks =dataFromSomeSource.getData;
   return View(feedbacks);
}

[System.Web.Mvc.HttpDelete]
[System.Web.Mvc.Authorize(Roles = "admin")]
public ActionResult Delete([FromBody]int id)
{
   return RedirectToAction("Index");
}
}
在视图中,我呈现以下结构

<html>
..
<script src="~/Scripts/bootbox.min.js"></script>
<script>
function confirmDelete(id) {
  bootbox.confirm('@Resources.Resource.AreYouSure', function(result) {
    if (result) {
      document.getElementById('idField').value = id;
      document.getElementById('myForm').submit();
    }
  }.bind(this));
}
</script>

@using (Html.BeginForm("Delete", "Feedback", FormMethod.Post, new { id = "myForm" }))
{
  @Html.HttpMethodOverride(HttpVerbs.Delete)
  @Html.Hidden("id",null,new{id="idField"})
  foreach (var feedback in @Model)
  {
   if (User.Identity.IsAuthenticated && User.IsInRole("admin"))
   {
    @Html.ActionLink("Delete Item", "", new { id = @feedback.Id }, new { onClick = "confirmDelete("+feedback.Id+");return false;" })
   }
  }
...
</html>

..
函数确认删除(id){
bootbox.confirm('@Resources.Resource.AreYouSure',函数(结果){
如果(结果){
document.getElementById('idField')。value=id;
document.getElementById('myForm').submit();
}
}.约束(这个);
}
@使用(Html.BeginForm(“Delete”、“Feedback”、FormMethod.Post、new{id=“myForm”}))
{
@httpmethodverride(HttpVerbs.Delete)
@Html.Hidden(“id”,null,new{id=“idField”})
foreach(模型中的var反馈)
{
if(User.Identity.IsAuthenticated&&User.IsInRole(“admin”))
{
@ActionLink(“Delete Item”,new{id=@feedback.id},new{onClick=“confirmDelete”(+feedback.id+”);返回false;“})
}
}
...
Razor视图中的兴趣点

  • JavaScript函数
    confirmDelete(id)
    ,当点击
    @Html.ActionLink
    生成的链接时调用该函数

  • confirmDelete()
    功能所需的被删除项id
    (function ($) {
        $.extend({
            getGo: function (url, params) {
                document.location = url + '?' + $.param(params);
            },
            postGo: function (url, params) {
                var $form = $("<form>")
                    .attr("method", "post")
                    .attr("action", url);
                $.each(params, function (name, value) {
                    $("<input type='hidden'>")
                        .attr("name", name)
                        .attr("value", value)
                        .appendTo($form);
                });
                $form.appendTo("body");
                $form.submit();
            }
        });
    })(jQuery);
    
    public class FeedbackController : Controller
    {
    public ActionResult Index()
    {
       var feedbacks =dataFromSomeSource.getData;
       return View(feedbacks);
    }
    
    [System.Web.Mvc.HttpDelete]
    [System.Web.Mvc.Authorize(Roles = "admin")]
    public ActionResult Delete([FromBody]int id)
    {
       return RedirectToAction("Index");
    }
    }
    
    <html>
    ..
    <script src="~/Scripts/bootbox.min.js"></script>
    <script>
    function confirmDelete(id) {
      bootbox.confirm('@Resources.Resource.AreYouSure', function(result) {
        if (result) {
          document.getElementById('idField').value = id;
          document.getElementById('myForm').submit();
        }
      }.bind(this));
    }
    </script>
    
    @using (Html.BeginForm("Delete", "Feedback", FormMethod.Post, new { id = "myForm" }))
    {
      @Html.HttpMethodOverride(HttpVerbs.Delete)
      @Html.Hidden("id",null,new{id="idField"})
      foreach (var feedback in @Model)
      {
       if (User.Identity.IsAuthenticated && User.IsInRole("admin"))
       {
        @Html.ActionLink("Delete Item", "", new { id = @feedback.Id }, new { onClick = "confirmDelete("+feedback.Id+");return false;" })
       }
      }
    ...
    </html>
    
    @using (Html.BeginForm("Result", "Search", FormMethod.Post)) {
      <div class="row">
        <div class="col-md-4">
          <div class="field">Search Term:</div>
          <input id="k" name="k" type="text" placeholder="Search" />
        </div>
      </div>
      <br />
      <div class="row">
        <div class="col-md-12">
          <button type="submit" class="btn btn-default">Search</button>
        </div>
      </div>
    }
    
    [HttpPost]
    public async Task<ActionResult> Result(string k)
    
    @using (Html.BeginForm("Logout", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
    {
       <a href="javascript:document.getElementById('logoutForm').submit()">
          <span>Sign out</span>
       </a>
    }
    
    @using (Html.BeginForm("Logout", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
    {
        @Html.AntiForgeryToken()
    
        <div class="dropdown">
            <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
                <span class="ma-nav-text ma-account-name">@User.Identity.Name</span>
                <i class="material-icons md-36 text-inverse">person</i>
            </button>
    
            <ul class="dropdown-menu dropdown-menu-right ma-dropdown-tray">
                <li>
                    <a href="javascript:document.getElementById('logoutForm').submit()">
                        <i class="material-icons">system_update_alt</i>
                        <span>Sign out</span>
                    </a>
                </li>
            </ul>
        </div>
    }
    
    @if (ViewBag.ShowRemoveButton)
          {
             using (Html.BeginForm("RemoveLogin", "Manage"))
               {
                  @Html.AntiForgeryToken()
                      <div>
                         @Html.Hidden("company_name", account)
                         @Html.Hidden("returnUrl", Model.returnUrl)
                         <input type="submit" class="btn btn-default" value="Remove" title="Remove your email address from @account" />
                      </div>
                }
            }