2011-11-17 11 views
10

0 ProyectoASP.Net MVC 3.0 Ajax.ActionLink valores de ruta de objeto dinámico utilizando Javascript

en mi punto de vista que tienen un oculto presentada, que tiene una UserID. Esta ID de usuario se genera con una acción (por lo que no se conocerá previamente)

Una vez que este campo oculto tenga un valor, me gustaría utilizar ese valor como un valor de ruta de actionlink. ¿Puedo hacerlo con un selector de jquery?

Mi campo oculto es

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

Mi ajax.ActionLink es

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

Cualquier idea si esto es posible?

Respuesta

12

Al generar el enlace de acción en el servidor se puede poner un poco de marcador de posición especial para el valor ruta ID de usuario:

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

y luego, cuando se asigna un valor al campo oculto en javascript que podría actualizar el enlace href acción, así:

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

Gracias, buena forma de manejar – HaBo

+4

si necesita hacer clic nuevamente en el enlace y pasar otro valor, ¿cómo puede encontrar y cambiar el valor nuevamente? – Patrick

+0

Me parece un poco decepcionante que esta sea la mejor manera. Las llamadas AJAX en la naturaleza generalmente consumirán la entrada del usuario en la página, y tener que reemplazar() una cadena mágica con mi propia cadena para usarla es simplemente hacky. –

6

Tal vez algo así podría funcionar. Ponga el enlace de acción en un div y modifíquelo con jquery en el lado del cliente.

<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 respuesta proporcionada por Darin es grande y me ayudó, sin embargo, como la observación sugiere que si es necesario hacer clic en el vínculo de nuevo y pasar una dif valor actual, ¿cómo haces eso? Este es un requisito si está actualizando vistas parciales etc. Así que aquí es cómo he conseguido exactamente eso ...

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

También se implementado un cheque por messageId> 0 en el controlador, de ahí el id es inicializado a -1. Se devuelve una vista "Error" si esta condición no se cumple.

Cuestiones relacionadas