2012-06-29 29 views
7

He estado buscando las últimas horas, y desafortunadamente no puedo encontrar un ejemplo de cómo llenar una tabla de datos con una acción de edición y eliminar columna de enlace usando .net y MVC.jquery datatables actionlink cómo agregar

Esto es lo que tengo hasta ahora, ¿cómo agrego un enlace de acción? ¿Qué me estoy perdiendo?

<script type="text/javascript"> 
$(document).ready(function() { 
    $('#myDataTable').dataTable({ 
     bProcessing: true, 
     sAjaxSource: '@Url.Action("Index1", "Default1")' 
    }); 

}); 
</script> 

<div id="container"> 
<div id="demo"> 
    <table id="myDataTable"> 
     <thead> 
      <tr> 
       <th> 
        RoleId 
       </th> 
       <th> 
        RoleName 
       </th> 
       <th> 
        UserId 
       </th> 
       <th> 
        UserName 
       </th> 
      </tr> 
     </thead> 
     <tbody> 
     </tbody> 
</table>  
</div> 
</div> 

Quiero agregar esto en la última columna;

<td> 
     @Html.ActionLink("Edit", "Edit", new {id=item.PrimaryKey}) | 
     @Html.ActionLink("Details", "Details", new { id=item.PrimaryKey }) | 
     @Html.ActionLink("Delete", "Delete", new { id=item.PrimaryKey }) 
    </td> 

Pero no puedo encontrar la manera de hacerlo.

Respuesta

17

Puede usar la propiedad aoColumns con la función fnRender para agregar columnas personalizadas. No puede usar el ayudante Html.ActionLink porque debe generar los enlaces dinámicamente desde el javascript. La propiedad aoColumns le ayuda a configurar cada columna; si no desea configurar una columna en particular, simplemente pase null, de lo contrario, debe pasar object({}).

La función fnRender le ayuda a crear los enlaces utilizando los valores de las otras columnas. Puede usar el oObj.aData para obtener los valores de la otra columna, como id, para generar los enlaces.

<script type="text/javascript">  
    $(document).ready(function() { 
     $('#myDataTable').dataTable({ 
      bProcessing: true,   
      sAjaxSource: '@Url.Action("Index1", "Default1")', 
      aoColumns: [ 
         null, // first column (RoleId) 
         null, // second column (RoleName) 
         null, // third (UserId) 
         null, // fourth (UserName) 

         {  // fifth column (Edit link) 
         "sName": "RoleId", 
         "bSearchable": false, 
         "bSortable": false, 
         "fnRender": function (oObj)        
         { 
          // oObj.aData[0] returns the RoleId 
          return "<a href='/Edit?id=" 
           + oObj.aData[0] + "'>Edit</a>"; 
         } 
         }, 

         { }, // repeat the samething for the details link 

         { } // repeat the samething for the delete link as well 

        ] 
    }); 
}); 
</script> 

Otra cosa importante en la salida JSON que regrese desde el servidor, para la columna de edición también tiene que devolver algo así como 1, 2, 3 o nada.

Referencia: http://jquery-datatables-editable.googlecode.com/svn/trunk/ajax-inlinebuttons.html

+5

"fnRender" ya no se utiliza. Use "mRender" en su lugar. http://www.datatables.net/usage/columns – asunrey

7

El fnRender se ha depreciado y el mRender no recibieron los mismos parámetros.

Esto funciona para mí, seguir el ejemplo @ Marcos:

{  // fifth column (Edit link) 
    "sName": "RoleId", 
    "bSearchable": false, 
    "bSortable": false, 
    "mRender": function (data, type, full) { 
     var id = full[0]; //row id in the first column 
     return "<a href='javascript:alert("+id+");'>Edit</a>"; 
    } 
2

Otro enfoque con aoColumnDefs

$('#myDataTable').dataTable({ 
    bProcessing: true, 
    sAjaxSource: '@Url.Action("Index1", "Default1")' 
    aoColumnDefs: [{ 
        "aTargets": [4], //Edit column 
        "mData": "RoleId", //Get value from RoleId column, I assumed you used "RoleId" as the name for RoleId in your JSON, in my case, I didn't assigned any name in code behind so i used "mData": "0" 
        "mRender": function (data, type, full) { 
         return '<a href=' + 
          '@Url.Action("Edit", "Default1")?RoleId=' + data + 
          '>Edit</a>'; 
        } 
        },{ 
        "aTargets": [5], //Detail column 
        "mData": "RoleId", 
        "mRender": function (data, type, full) { 
         return '<a href=' + 
          '@Url.Action("Detail", "Default1")?RoleId=' + data + 
          '>Detail</a>'; 
        } 
        },{ 
        "aTargets": [6], //Delete column 
        "mData": "RoleId", 
        "mRender": function (data, type, full) { 
         return '<a href=' + 
          '@Url.Action("Delete", "Default1")?RoleId=' + data + 
          '>Delete</a>'; 
        } 
        }] 
}); 
3

Las otras respuestas están utilizando la sintaxis de tablas de datos heredados. Para tablas de datos 1.10+, la sintaxis para columnDefs es el siguiente:

$('#MyDataTable').DataTable({ 
    "processing": true, 
    "ajax": '@Url.Action("Index1", "Default1")', 
    "columnDefs": [ 
     {"targets": [4], "data": "RoleId", "render" : function(data, type, full) { return '@Html.ActionLink("Edit", "Edit", new {id = "replace"})'.replace("replace", data);}}, 
     {}, //repeat 
     {} //repeat 
    ] 
}); 

nota: Con el fin de obtener el modelo en el ActionLink, estoy usando JavaScript replace() para reemplazar la cadena "reemplazar" con data, que se define como "RoleId" anteriormente en la columnaDef

0

He utilizado el código mencionado para la tabla de datos 1.10+ pero obtengo la cadena en la celda de la tabla de datos en lugar del enlace.

@Html.ActionLink("Edit", "Edit", new {id = "294"}) 

nota que el uso y la vieja versión MVC3 en la solución Aquí mi javascript:

$(document).ready(function() { 

var tenantid = $('#tenantid').text(); 
$("#title").html("<h1>User List for TenantID: "+ tenantid + " </h1>"); 

var oTable = $('#list').DataTable({ 
    "serverSide": true, 
    "ajax": { 
     "type": "POST", 
     "url": '/User/DataHandler', 
     "contentType": 'application/json; charset=utf-8', 
     'data': function (data) 
     { 
      data.ID = tenantid; 
      return data = JSON.stringify(data); 
     } 
    }, 
    "dom": 'lfrtiSp',   
    "processing": true, 
    "paging": true, 
    "deferRender": true,   
    "pageLength": 10, 
    "lengthMenu": [5, 10, 25, 50, 75, 100], 
    "columnDefs": [ 
     { "targets": [-1], "data": "UserID", "render": function (data, type, row, meta) { return '@Html.ActionLink("Edit", "Edit", new {id = "replace"})'.replace("replace", row.UserID); } } 

    ], 

    "columns": [ 
     { "data": "UserID", "orderable": true }, 
     { "data": "UserGUID", "orderable": false }, 
     { "data": "UserName", "orderable": true }, 
     { "data": "UserEMAil", "orderable": true }, 
     { "data": "UserIsDeleted", "orderable": true }, 
     { "data": "Action", "orderable": false } 
    ], 

    "order": [0, "asc"] 

    }); 
}); 
0

he encontrado otra manera de conseguir este ActionLink funciona mediante la ayuda de esta post (comentarios Olivier):

agrega atributos de etiquetas de datos en el nodo de tabla que reutiliza en el Javascript

en cshtml:

<table class="table table-striped display" id="list" 
      data-url-edit="@Url.Action("Edit","User", new { id = "replace"})" 

en su archivo * .js en el área de THS columndefs:

"columnDefs": [ 
     { 
      "targets": [-1], "data": "UserID", "render": function (data, type, row, meta) { 
       return '<a href="' + $('#list').data('url-edit').replace("replace", row.UserID) + '">Edit</a> | ' 
        + '<a href="' + $('#list').data('url-details').replace("replace", row.UserID) + '">Details</a> | ' 
Cuestiones relacionadas