2011-11-17 10 views
10

0 ProjectASP.Net MVC 3.0 Ajax.ActionLink valori del percorso degli oggetti dinamici che utilizzano JavaScript

Nel mio punto di vista ho un nascosta archiviato che ha un UserID. Questo ID utente viene generato su un'azione (quindi non sarà noto prima)

Una volta che questo campo nascosto ha un valore, vorrei utilizzare tale valore come un routevalue del link di azione. Posso farlo con un selettore jquery.

mio campo nascosto è

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

mio ajax.ActionLink è

@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" }) 

Qualsiasi idea se questo è possibile?

risposta

12

Quando si genera il link azione sul server si potrebbe mettere un po 'segnaposto speciale per il valore di percorso 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" 
    } 
) 

e poi quando si assegna un valore per il campo nascosto in JavaScript è possibile aggiornare il link href azione pure:

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

Grazie per il bel modo di gestire – HaBo

+4

se è necessario fare nuovamente clic nel collegamento e passare un altro valore, come è possibile trovare e modificare nuovamente il valore? – Patrick

+0

Trovo un po 'deludente che questo sia il modo migliore. Le chiamate AJAX in natura generalmente consumano l'input dell'utente sulla pagina, e dovendo .replace() una stringa magica con la mia stringa per usare quella è solo hacky. –

6

Forse qualcosa del genere funzionerebbe. Metti il ​​tuo link di azione in un div e modificalo con jquery sul lato client.

<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

la risposta fornita da Darin è grande e mi ha aiutato, tuttavia, come il commento suggerisce se è necessario fare di nuovo clic sul link e passare un dif valore feroce, come si fa? Questo è un obbligo, se si sta aggiornando una vista parziale ecc Quindi, ecco come ho realizzato esattamente questo ...

$(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" } 
          ) 

anche implementato è un assegno di messageId> 0 nel controller, quindi, perché l'id viene inizializzato a -1. Una vista "Errore" viene restituita se questa condizione non viene soddisfatta.

Problemi correlati