MvcContrib Grid - come aggiungere e Elimina righe con l'Ajax?
-
27-09-2019 - |
Domanda
mi chiedo qual è la migliore strategia per eliminare una riga in MvcContrib griglia generata.
Considerate questa griglia:
Html.Grid(Model.Proc.Documents).Columns(column =>
{
column.For(c => c.Name).Named("Title");
column.For(c => c.Author.Name).Named("Author");
column.For("Action").Action(
delegate(DocumentDto doc)
{
const string cbxFrmt =
"<td><strong><a href=\"#\" onclick=\"DocDetails({0})\">View details</a></strong> | " +
"<strong><a href=\"#\" onclick=\"RemoveDoc({1})\">Delete</a></strong>" +
"</td>";
Response.Write(string.Format(cbxFrmt, doc.Id, doc.Id));
}
).DoNotEncode().Named("Action");
})
.Attributes(id => "documentgrid"));
Ogni riga ha un collegamento che chiama la funzione RemoveDoc (docid) JavaScript, dove devo rimuovere la riga chiamando un'azione regolatore per eliminare effettivamente il documento modello di dati, che è abbastanza facile, ma poi non posso figura come rimuovere la riga dalla tbody con Jquery. Si prega di avvisare. Sono su una strada sbagliata complitely? Qual è il modo migliore per farlo?
E di aggiungere una riga. Inizialmente ho pensato di farlo in qualche modo simile:
function UploadDocument() {
var action = '<%=Html.BuildUrlFromExpression<MyController>(c => c.UploadDocument(parameters))%>';
$.ajax({
type: "POST",
url: action,
data: { data to upload },
cache: false,
dataType: 'text',
success: function (data, textStatus) {
var newRow = "<tr class='gridrow'><td>" + v1 +
"</td><td>" + doc_author + "</td>" +
"<td><strong><a href=\"#\" onclick=\"DocDetails(doc_id_returned_by_ajax)\">View details</a></strong> | " +
"<strong><a href=\"#\" onclick=\"RemoveDoc(doc_id_returned_by_ajax)\">Delete</a></strong>" +
"</td>" +
"</tr>";
var docgrid = $('#documentgrid');
var tbody = $("table[class='grid']>tbody");
$(tbody).append(newRow);
},
error: function (xhr, textStatus, errorThrown) {
var msg = JSON.parse(xhr.responseText);
alert('Error:' + msg.Message);
}
});
}
Ma io non sono sicuro che questa è la migliore pratica per farlo. Eventuali altre strategie?
Grazie!
Soluzione
Forse qualcosa tra le righe:
<%= Html.Grid<Document>(Model.Proc.Documents)
.Columns(column => {
column.For(c => c.Name).Named("Title");
column.For(c => c.Author.Name).Named("Author");
column.For("TableLinks").Named("");
})
%>
e in TableLinks.ascx
:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeNs.Document>" %>
<td>
<% using (Html.BeginForm<HomeController>(c => c.Destroy(Model.Id))) { %>
<%= Html.HttpMethodOverride(HttpVerbs.Delete) %>
<input type="submit" value="Delete" />
<% } %>
</td>
e nel controllore:
[HttpDelete]
public ActionResult Destroy(int id)
{
Repository.Delete(id);
return RedirectToAction("Index");
}
Come si può vedere che uso un modulo standard con un pulsante di invio da eliminare. Se si desidera utilizzare AJAX è molto facile per generare un link semplice e allegare l'evento click con jQuery come hai fatto nel tuo esempio:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeNs.Document>" %>
<td>
<%= Html.ActionLink(
"Delete document",
"Destroy",
new { id = Model.Id },
new { @class = "destroy" }
) %>
</td>
e infine progressivamente aumentare la link:
$(function() {
$('.destroy').click(function() {
$.ajax({
url: this.href,
type: 'delete',
success: function(result) {
alert('document successfully deleted');
}
});
return false;
});
});
È possibile vedere questi concetti in azione in questo progetto di esempio .