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