-3

我有一个项目实体。项目列表显示在脚手架列表视图中,如下所示。Edit-Details-Delete 是模板生成的ActionLinks。每个都链接到一个新的控制器动作并加载另一个视图

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

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

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

2 回答 2

2

您可以使用 AJAX:

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

你当然会有一个相应的控制器动作来负责批准一个项目:

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

您还可以使用OnSuccess和的OnFailure属性AjaxOptions来定义在发生这些事件时将调用的相应 javascript 函数。

需要说的是,要让Ajax.*帮助者做任何有用的事情,您需要将jquery.unobtrusive-ajax.js脚本包含到您的页面中:

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

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

<appSettings>
    <add key="ClientValidationEnabled" value="true" />
    ...
</appSettings>
于 2012-07-02T13:42:10.333 回答
0

@Html.ActionLinkhelper 方法为锚标记生成 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");
}
于 2012-07-02T13:44:04.407 回答