2011-11-17 10 views
10

0 ProjektuASP.Net MVC 3.0 Ajax.ActionLink obiekt dynamiczny wartości trasy przy użyciu JavaScript

Moim zdaniem mam ukryty złożony, który ma UserID. Ten identyfikator użytkownika jest generowany podczas działania (więc nie będzie to znane wcześniej).

Gdy to ukryte pole ma wartość, chciałbym użyć tej wartości jako route link trasy akcji. Czy mogę to zrobić za pomocą selektora jquery.

Moje ukryte pole jest

<input id="NewUserID" type="hidden" value="80"> 

My Ajax.ActionLink jest

@Ajax.ActionLink("Edit", "EditUser", "User", new { UserID = "$('#GetNewPatientID').val()" }, 
     new AjaxOptions 
     { 
      OnSuccess = "ShowEditUserForm", 
      UpdateTargetId = "EditUserDetails", 
      InsertionMode = InsertionMode.Replace, 
      HttpMethod = "Get" 
     }, new { @class = "button", id = "EditUserButton" }) 

Każdy pomysł, jeśli jest to możliwe?

Odpowiedz

12

Podczas generowania linku działania na serwerze można umieścić jakiś specjalny zastępczy dla wartości trasy UserID:

@Ajax.ActionLink(
    "Edit", 
    "EditUser", 
    "User",  
    new { 
     UserID = "__userid__" 
    }, 
    new AjaxOptions { 
     OnSuccess = "ShowEditUserForm", 
     UpdateTargetId = "EditUserDetails", 
     InsertionMode = InsertionMode.Replace, 
     HttpMethod = "Get" 
    }, 
    new { 
     @class = "button", 
     id = "EditUserButton" 
    } 
) 

a następnie po przypisaniu wartości do pola ukrytego w javascript można aktualizować działanie łącza href także:

$('#EditUserButton').attr('href', function() { 
    return this.href.replace('__userid__', $('#NewUserID').val()); 
}); 
+0

Dzięki niezły sposób obsłużyć – HaBo

+4

, jeśli chcesz ponownie kliknąć w link i podać inną wartość, jak znaleźć i zmienić wartość ponownie? – Patrick

+0

Jestem trochę rozczarowany, że to najmilszy sposób. AJAX wywoływane w środowisku naturalnym generalnie zużywają dane wprowadzane przez użytkownika na stronie i muszą mieć .replace() magiczny ciąg z własnym ciągiem znaków do użycia, który jest po prostu hacky. –

6

Może coś takiego by działało. Umieść link działania w div i zmodyfikuj go za pomocą jquery po stronie klienta.

<div id="ajaxTest"> 
@Ajax.ActionLink("Edit", "EditUser", "User", new { UserID = "$('#GetNewPatientID').val()" }, 
     new AjaxOptions 
     { 
      OnSuccess = "ShowEditUserForm", 
      UpdateTargetId = "EditUserDetails", 
      InsertionMode = InsertionMode.Replace, 
      HttpMethod = "Get" 
     }, new { @class = "button", id = "EditUserButton" }) 
</div> 

<script type="text/javascript"> 
    $(document).ready(function(){ 
     $("#ajaxTest a").click(function (event) { 
      $(this).attr('href', "/EditUser/Edit?UserId='+ $('#NewUserId).val() +'"); 
    }); 
    }); 
</script> 
1

odpowiedź udzielana przez Darin jest wielki i pomógł mi jednak jako komentarz sugeruje, jeśli trzeba ponownie kliknąć link i przejść DIF jakąś wartość, jak to robisz? Jest to wymóg, jeśli aktualizowanie częściowe widoki itd. Więc tutaj jest jak osiągnąłem dokładnie to ...

$(document).ready(function() { 
    $('#replyMessageButton').click(function() { 
     var url = $("#replyMessageButton").attr("href") 
     $("#replyMessageButton").attr("href", TrimToSlash(url) + $("#MessageId").val()) 
    }); 
}); 

function TrimToSlash(value) { 

    if (value.indexOf("/") != -1) { 

     while (value.substr(-1) != '/') { 
      value = value.substr(0, value.length - 1); 
     } 
    } 
    return value; 
} 

     @Ajax.ActionLink("Reply", "ReplyMessage", "MessageBox", new { id = -1 }, 
         new AjaxOptions 
          { 
           UpdateTargetId = "replyMessageContainer", 
           InsertionMode = InsertionMode.Replace, 
           OnBegin = "UpdateDisplay('replyMessage')", 
           OnFailure = "UpdateDisplay('default')" 
          }, 
          new { @id = "replyMessageButton" } 
          ) 

realizowany jest także czek na messageid> 0 w sterowniku, więc dlaczego identyfikator jest inicjowany -1. Jeśli ten warunek nie zostanie spełniony, zwracany jest widok "Błąd".

Powiązane problemy