MVC发布到另一个动作

时间:2010-02-09 04:07:18

标签: c# asp.net-mvc post

海峡的细节......

我正在开展一个个人项目,基本上它是一个任务列表。无论如何;我设法让标准的添加,编辑,删除任务功能顺利;现在我被困在一些我知道必须非常简单的东西上。我希望用户能够从详细信息页面接受任务,现在我可以轻松地将该选项放在下拉列表中,并允许用户选择它然后保存;但我想提供一个链接,他们可以单击“接受任务”链接然后转到我的控制器操作并拉动任务然后更新TaskStatus字段。

这是我的控制器动作

        //
    // TaskStatus Updates
    [AcceptVerbs(HttpVerbs.Post), Authorize]
    public ActionResult AcceptTask(int id)
      {
        Task task = taskRepository.GetTask(id);

        try
        {
            task.TaskStatus = "Accepted";
            taskRepository.Save();
            return RedirectToAction("Details", new { id = task.TaskId });
        }
        catch (Exception)
        {

            throw;
        }

    }

那么现在如何在“详细信息”视图中调用此操作?

3 个答案:

答案 0 :(得分:2)

包含一个回发到AcceptTask操作的按钮的小表单将起作用。如果你愿意,它甚至可以是一个AJAX形式。

<% using (Html.BeginForm("accepttask","task",new { id = Model.TaskId })) { %>
    <input type="submit" value="Accept Task" />
<% } %>

答案 1 :(得分:1)

链接(<a>)无法发布表单,因此您有三种选择:

  1. 改为使用按钮;
  2. 请改用<input type="image">,您可以将其看作类似于链接;
  3. 使用JavaScript执行此操作。
  4. 已经为#1发布了一个答案,很容易修改为#2。我将为#3发布一个jQuery示例,尽管您可以使用任何JS库:

    <a id="acceptTaskLink" href="#">Accept</a>
    <span id="accepted" style="display: none">Accepted</span>
    ...
    <script type="text/javascript">
        $('#acceptTaskLink').click(function() {
            $.post('/site/task/accept',
                function(result) {
                    $('#acceptTaskLink').hide();
                    $('#accepted').show();
                });
        });
    </script>
    

    此脚本向控制器发出Ajax帖子,然后在成功发布后,它将“Accept”链接更改为常规的“Accepted”文本(通过隐藏链接并显示确认元素,可能在同一个地方)。

答案 2 :(得分:1)

根据定义,链接不应执行任何操作。这导致了一些奇怪的问题:当Google抓取您的网站时会发生什么?当有人刷新页面时会发生什么?当有人为该页面添加书签时会发生什么?

改变内容的动作通常是通过post post发布的。首先发布更改内容的Action(AcceptTask),然后重定向到显示结果的页面。在你的情况下,我建议获取成功消息的任务列表。重定向使用Tempdata后,Mesage可用。