控制器AJAX方法返回AJAX ActionLink

时间:2011-04-04 23:20:28

标签: asp.net asp.net-mvc asp.net-mvc-2 asp.net-mvc-3 asp.net-ajax

我对MVC很新,只是想尝试实现一些我认为不应该太复杂的东西。只是想知道最好的方法是什么。我有一个Event-RSVP应用程序(NerdDinner类),您可以在其中查看事件的详细信息,然后单击一个AJAX链接,该链接将回复您的活动。

    <% 
    if (Model.HasRSVP(Context.User.Identity.Name))
    {
    %>
    <p>
    You are registered for this event!&nbsp;            
    <%: 
    Ajax.ActionLink("Click here if you can't make it!", "CancelRegistration", "RSVP", new { id = Model.RSVPs.FirstOrDefault(r => r.AttendeeName.ToLower() == User.Identity.Name.ToLower()).RSVPID }, new AjaxOptions { UpdateTargetId = "QuickRegister"}) 
    %>
    </p>
    <% 
    }
    else
    { 
    %>
    <p>
    <%: 
Ajax.ActionLink("RSVP for this event", "Register", "RSVP", new { id=Model.EventID }, new AjaxOptions { UpdateTargetId="QuickRegister" }) %>
    </p>
    <% 
    } 
    %>

现在对应这两个链接,我在RSVP控制器中的功能看起来像这样。

[Authorize, HttpPost]
public ActionResult Register(int id)
{
    Event event = eventRepository.GetEvent(id);

    if (event == null)
        return Content("Event not found");

    if (!event.IsUserRegistered(User.Identity.Name))
    {
        RSVP rsvp = new RSVP();
        rsvp.AttendeeName = User.Identity.Name;
        event.RSVPs.Add(rsvp);
        eventRepository.Save();            
    }

    return Content("Thanks, you are registered.");

}

[Authorize, HttpPost]
public ActionResult CancelRegistration(int id)
{
    RSVP rsvp = eventRepository.GetRSVP(id);    

    if (rsvp == null)
        return Content("RSVP not found");

    if (rsvp.Event.IsUserRegistered(User.Identity.Name))
    {
        eventRepository.DeleteRSVP(rsvp);
        eventRepository.Save();
    }

    return Content("Sorry, we won't be seeing you there!");
}

这两个似乎都没有任何问题。现在我想通过做这两个中的任何一个来让它变得更加迷人:

1)从控制器返回一个AJAX链接,这样当你注册时,你会看到没有页面刷新的取消注册链接。

2)当控制器方法完成执行时,以某种方式使视图呈现刷新,因此我的问题中的第一个代码块在单击任何AJAX链接后执行。因此,点击注册将注册您并显示取消链接,点击取消将取消您的注册并显示注册链接。

非常感谢任何帮助。 感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用jQuery show并隐藏这些链接。

我从不使用Ajax.ActionLink,我在没有帮助程序的情况下执行我的AJAX,但我认为它应该看起来像这样:

Ajax.ActionLink("Click here if you can't make it!", "CancelRegistration", "RSVP", new { id = Model.RSVPs.FirstOrDefault(r => r.AttendeeName.ToLower() == User.Identity.Name.ToLower()).RSVPID }, new AjaxOptions { UpdateTargetId = "QuickRegister", OnSuccess = "ShowHideLinks" }, new { id = "cancel-link", @style = "display:none"})
Ajax.ActionLink("RSVP for this event", "Register", "RSVP", new { id=Model.EventID }, new AjaxOptions { UpdateTargetId="QuickRegister", OnSuccess = "ShowHideLinks" }, new { id = "register-link"})

和一些javascript / jQuery初始化当前的显示链接:

        function ShowHideLinks() {
            $('#register-link').toggle();
            $('#cancel-link').toggle();
        }
        <%: if(Model.HasRSVP(Context.User.Identity.Name)) { %>
            ShowHideLinks();
        <%: } %>

希望这有帮助!

答案 1 :(得分:0)

您可以使用jQuery设置链接。我看到你从两个动作方法传递内容......你可以在jQuery中使用$ .post()来执行这些动作,并在成功事件处理程序中比较返回的内容(你需要发送更容易比较的内容)比当前的字符串)并适当地设置链接。