Контроллер AJAX метод для возврата AJAX ActionLink - PullRequest
0 голосов
/ 05 апреля 2011

Я довольно новичок в MVC и просто пытаюсь достичь чего-то, что, на мой взгляд, не должно быть слишком сложным для достижения. Просто хочу знать, что является лучшим подходом для этого. У меня есть приложение Event-RSVP (вид NerdDinner), куда вы переходите, чтобы просмотреть подробную информацию о событии, а затем щелкаете ссылку AJAX, которая отправит вам RSVP для участия в мероприятии.

    <% 
    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 Controller выглядят так:

[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 ]

1 голос
/ 05 апреля 2011

Вы можете с помощью 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 голосов
/ 05 апреля 2011

Вы можете установить ссылки, используя jQuery. Я вижу, что вы передаете Content от обоих методов действия ... Вы можете использовать $ .post () в jQuery для выполнения этих действий и в обработчике события success сравнить возвращенное содержимое (вам нужно отправить что-то, что проще сравнить чем текущие строки) и установите ссылки соответствующим образом.

...