列表显示模板中的HTTP帖子链接

时间:2012-07-02 13:38:23

标签: jquery asp.net-mvc asp.net-mvc-3

我有一个Projects实体。项目列表显示在Scaffolded List View中,如下所示。编辑 - 详细信息 - 删除是由模板生成的ActionLink。每个链接到新的控制器操作并加载另一个视图

ProjectName  | Created By | Created On | Status |
-------------|------------|------------|--------|--------------------
Test Project | USER1      | 12/31/2010 |  NEW   | Edit |Details |Delete

每个项目都有一个状态 - 新建,已批准,已拒绝。 我想添加名为Approve and Denied的列表的链接,这些链接不加载视图。他们只是改变了项目的状态。我相信这些将是HTTP Post Links。我用google搜索,但没有找到一个好的工作示例。

ProjectName  | Created By | Created On | Status |
-------------|------------|------------|--------|------------------------------------
Test Project | USER1      | 12/31/2010 |  NEW   | Edit |Details |Delete|Approve|Denied

2 个答案:

答案 0 :(得分:2)

您可以使用AJAX:

@Ajax.ActionLink(
    "approve project", 
    "Approve", 
    new { projectId = item.ProjectId }, 
    new AjaxOptions { HttpMethod = "POST" }
)

您当然会有一个相应的控制器操作来处理批准项目:

[HttpPost]
public ActionResult Approve(int projectId)
{
    ...
}

您还可以使用OnSuccess的{​​{1}}和OnFailure属性来定义在发生这些事件时将调用的各个javascript函数。

有人要求AjaxOptions帮助者做一些有用的事情,您需要在页面中加入Ajax.*脚本:

jquery.unobtrusive-ajax.js

并且必须在web.config中启用不显眼的AJAX:

<script type="text/javascript" src="@Url.Content("~/scripts/jquery.unobtrusive-ajax.js")"></script>

答案 1 :(得分:0)

@Html.ActionLink辅助方法为锚标记生成HTML标记,单击它们通常会执行 HTTPGET 方法。如果您要执行 HTTPPOST 操作,您可以使用Html.ActionLink帮助程序生成一个链接并使用javascript,覆盖默认链接行为以对另一个操作方法执行HTTPPost更改数据库中的状态。您可以使用preventDefault方法来阻止默认链接行为(导航新页面)

@Html.ActionLink("Approve","Approve","Project",new { @id="someid"},new { @class="delClass"})
@Html.ActionLink("Denied","Denied","Project",new { @id="someid",anotherParam="someval"},new { @class="delClass"}))

假设您的控制器名称为Project

使用一些jQuery代码覆盖默认链接行为并对action方法进行AJAX发布(HTTP Post)

<script type="text/javascript">
 $(function(){

    $(".delClass").click(function(e){

       e.preventDefault();  // prevent the default behaviour
       $.post(($this).attr("href"),function(data){
           //Do whatever with the resutl received from the action method call.
           //alert(data);  // may be alert ?
       });

    });

 });    
</script>

立即使用Action方法处理此问题

[HttpPost]
public ActionResult Approve(string id)
{
  //Do the backend transaction with the id value.

  return Content("Approved");
}
[HttpPost]
public ActionResult Denied(string id,string anotherParam)
{
  //Do the backend transaction with the parameters value.

  return Content("Denied");
}