net框架 ASP.NET MVC ActionLink和post方法




asp net框架 (14)

任何人都可以告诉我如何使用ActionLink和POST方法将值提交给Controller?
我不想使用按钮。
我想它有jQuery的东西。


我会建议保持纯粹的REST原则和使用HTTP删除您的删除。 不幸的是,HTML规范只有HTTP Get&Post。 标签只能使用HTTP Get。 表单标签可以执行HTTP Get或Post。 幸运的是,如果你使用Ajax,你可以做一个HTTP删除,这是我推荐的。 有关详细信息,请参阅以下文章: Http删除


这是一个融入默认ASP.NET MVC 5项目的答案,我相信在UI中很好地完成我的样式目标。 表单使用纯JavaScript提交给一些包含表单。

@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>
}

完全显示的用例是Web应用程序导航栏中的注销下拉列表。

@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>
}

为了POST,你需要提交表单数据。 我不认为用ActionLink可以做到这一点。 看看这个链接


您可以使用jQuery为所有按钮执行POST。 只要给他们相同的CssClass名称。

使用“返回false”; 在你的onclick javascript事件结束时,如果你想在文章后面做一个服务器端的RedirectToAction,否则返回视图。

剃刀代码

@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#

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveAction(SaveViewModel model)
{
    // Save code here...

    return RedirectToAction("Index");
    //return View(model);
}

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

@using (Html.BeginForm("Delete", "Admin"))
{
       @Html.Hidden("ProductID", item.ProductID)
       <input type="submit" value="Delete" />
}

这对我来说是一个难以解决的问题。 我如何在剃刀和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>
}

行动方法

public ViewResult Edit(Product prod)
{
    ContextDB contextDB = new ContextDB();

    Product product = contextDB.Products.Single(p => p.ProductID == prod.ProductId);

    product = prod;

    contextDB.SaveChanges();

    return View("Edit");
}

这里的要点是,Url.Action不关心动作方法是GET还是POST。 它将访问任何一种方法。 您可以使用数据传递给操作方法

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

routeValues对象。 我已经试过这个,它的工作原理。 不,你没有在技术上做一个帖子或提交表单,但如果routeValues对象包含你的数据,它不管是一个帖子还是一个get。 您可以使用特定的操作方法签名来选择正确的方法。


如果你有自定义数据, jQuery.post()将会工作。 如果你想发布现有的表单,使用ajaxSubmit()更容易。

你不必在ActionLink本身设置这段代码,因为你可以在document.ready()事件中附加链接处理器(这是一个首选的方法),例如使用$(function(){ ... }) jQuery的伎俩。


这是我解决问题的方法。 这是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>

感兴趣的点Razor View

  1. JavaScript函数使用@Html.ActionLink生成的链接被点击时调用的confirmDelete(id) ;

  2. confirmDelete()函数需要点击项目的id。 此项目从onClick处理程序传递confirmDelete("+feedback.Id+");return false; 注意处理程序返回false以防止默认操作 - 即获取目标请求。 按钮的OnClick事件可以使用jQuery附加到列表中的所有按钮作为替代(可能会更好,因为它会减少HTML页面中的文本并且可以通过data-属性传递data- )。

  3. Form有id=myForm ,以便在confirmDelete()找到它。

  4. 表单包含@Html.HttpMethodOverride(HttpVerbs.Delete)以便使用HttpDelete动词作为用HttpDeleteAttribute标记的HttpDeleteAttribute

  5. 在JS函数中我使用动作确认(在外部插件的帮助下,但标准确认也可以正常工作)。不要忘记在回调var that=this使用bind()或者var that=this (不管你喜欢什么)。

  6. 表单具有id='idField'name='id'的隐藏元素。 因此,在确认之后提交表单( result==true )之前,隐藏元素的值设置为传递参数的值,浏览器将数据提交给控制器,如下所示:

请求URLhttp://localhost:38874/Feedback/Delete

请求方法 :POST状态码:302找到

响应头

位置:/反馈主机:localhost:38874 表单数据 X-HTTP-Method-Override:DELETE id:5

正如你所看到的,它是带有X-HTTP-Method-Override的POST请求:DELETE和正文中的数据设置为“id:5”。 响应具有302个重定向到索引操作的代码,通过此操作可以在删除后刷新屏幕。


遇到这种情况需要从搜索(索引)页面POST到结果页面。 我并不需要像维塔利所说的那样多,但它指出了我的正确方向。 我所要做的就是这样:

@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)

使用以下呼叫操作链接:

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

要提交表单值,请使用:

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

它会将数据提交给客户控制器和CustomerSearchResults操作。


@Aidos有正确的答案,只是想澄清一下,因为它隐藏在@CodingWithSpike发表的评论中。

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

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


您不能使用ActionLink因为ActionLink呈现锚点<a>标记。
你可以使用jQuery AJAX文章
或者只需调用带有或不带有jQuery的表单的submit方法(这可能是非AJAX),也许在任何控件的onclick事件中都会引起你的幻想。


ActionLink永远不会发布帖子。 它总是触发GET请求。





actionlink