0

我对MVC相当陌生,只是试图实现我认为不应该太复杂的事情。只是想知道最好的方法是什么。我有一个Event-RSVP应用程序(NerdDinner类),您可以在其中查看事件的详细信息,然后单击一个AJAX链接,该链接将回复您的事件。控制器AJAX方法返回AJAX ActionLink

<% 
    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链接后执行我的问题中的第一个代码块。因此,点击注册将注册您并显示您取消链接,点击取消将取消您的注册并显示注册链接。

任何帮助将不胜感激。 谢谢。

+0

在下面的评论混淆后,这里有一些更多的解释。我希望能够做的是1)你没有订阅(文本)&点击rsvp(链接)2)你订阅(文本)和点击取消(链接)显示交替基于用户的当前RSVP状态。客户没有这样做的具体要求,这是我学习ASP .Net MVC的一部分,我只是想了解我有什么选择。从您的评论下面,它看起来像jQuery $ .post()是要走的路。所以我现在会进一步调查,看看我是否有任何问题。 – 2011-04-06 10:01:00

回答

1

你可以通过使用jQuery显示并隐藏这些链接。

我从来没有使用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(); 
     <%: } %> 

希望得到这个帮助!

+0

我不认为这种方法可行,因为内容是动态的。基本上我希望它能够工作,以便单击后点击链接的视图部分会得到更新。 – 2011-04-05 22:53:05

+0

你想在你的更新部分显示什么?您需要向我们提供更多信息。我也认为你应该使用jQuery $ .post()而不是Ajax.ActionLink。如果数据很复杂,您可能还想查看jQuery模板,但您不想在控制器中返回HTML:http://api.jquery.com/jQuery.template/ – VinnyG 2011-04-06 02:33:42

+0

谢谢,我已添加对我的问题发表评论,希望它能让事情更清楚。 – 2011-04-06 10:05:12

0

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

+0

感谢您的回答。这将工作,但将需要对页面的工作方式进行一些更改。如果我希望基于用户是否注册,页面上显示的数据是动态的。如果我没有正确理解你的回复,请纠正我。 – 2011-04-05 22:55:25

+0

正如你所说 - 你不需要翻译你的页面就需要对代码做一些修改。但是,当您将页面上显示的数据表示为动态时,您可以通过传递上下文(内联html)并将其呈现在页面上来实现当前操作。 – sajoshi 2011-04-06 01:58:38

+0

谢谢澄清。我不想从控制器发送内嵌html。我将使用下面@VinnyG提到的jQuery $ .post()。 – 2011-04-06 10:04:37