Question

J'utilise MvcContrib surtout pour la pagination, le tri et le filtrage des aspects. Ma grille contient toutes les adresses dans notre application de liste de diffusion (back-end uniquement). L'utilisateur peut supprimer, activer, et les membres de la liste inactivent, donc il y a des liens d'action pour ces options sur chaque ligne. En utilisant jQuery, je capturais ce clic et effectuer d'autres choses comme la notification d'affichage de l'action est terminée.

En raison de cela, le problème, c'est comment puis-je rafraîchir la grille après avoir effectuer ces actions afin que l'utilisateur peut voir les résultats? Sur une suppression, je peux masquer la ligne. Que puis-je faire pour quand une personne active / désactive un e-mail? Il suffit d'utiliser jQuery pour mettre à jour la valeur dans le tableau qui indique l'état?

// Activate the email address
$(".ActivateLink").click(function() {
    var id = $(this).attr("href");
    var i = id.indexOf("#");
    id = id.substring(i + 1);
    $.ajaxSetup({ 'async': false });
    $.post("/List/Activate", { "id": id }, function(data) {
        $(".message").text(data.message).addClass("notice");
    }, "json");
    return false;
});

Mon contrôleur d'action:

    //
    // POST: /List/Activate
    [HttpPost]
    public ActionResult Activate(int id)
    {
        string message = String.Empty;
        db.ActivateEventEmail(id, ref message);
        return Json(new { message = message });
    }

Ma Vue:

<%= Html.Grid(Model.EmailAddressList).Columns(column => {
    column.For("ImageActions").Named("").Sortable(false);
    column.For(a => (a.Email.Length > 30) ? String.Format("{0}...", a.Email.Substring(0, 30)) : a.Email).Encode(true).SortColumnName("Email").Named("Email Address");
    column.For(a => (a.ContactName.Length > 30) ? String.Format("{0}...", a.ContactName.Substring(0, 30)) : a.ContactName).Encode(true).SortColumnName("ContactName").Named("Contact Name");
    column.For(a => a.SignupDate).Named("Signup Date").Format("{0:d}").Attributes(@style => "text-align: right;");
    column.For(a => a.AccountStatus ? "Yes" : "No").SortColumnName("AccountStatus").Named("Active").Attributes(@style => "text-align: center;");
}).Sort(Model.GridSortOptions)
    .Attributes(@class => "table-list", style => "width: 100%;").RowAttributes(c => new MvcContrib.Hash(@class => "gridrow"))
%>
Était-ce utile?

La solution

D'accord, je me suis dit cela.

D'abord je viens dû ajouter un appel à une fonction que je vais avoir plus tard sur le code.

// Activate the email address
$(".ActivateLink").live('click', function() {
    var id = $(this).attr("href");
    var i = id.indexOf("#");
    id = id.substring(i + 1);
    $.ajaxSetup({ 'async': false });
    $.post("/List/Activate", { "id": id }, function(data) {
        refreshTable();
        $(".message").text(data.message).addClass("notice");
    }, "json");
    return false;
});

L'action du contrôleur ci-dessus, je ne pas toucher et la vue que j'avais ci-dessus, je ne touche pas. La nouvelle fonction javascript je crée est la suivante:

    function refreshTable() {
        $.ajaxSetup({
            async: false,
            cache: false
        });
        $.get('<%= Url.Action("Index", "List", new { filterText = Model.FilterText, filterActive = Model.FilterActive, filterGroup = Model.FilterGroup }) %>',
        function(response) {
            $(".table-list").replaceWith(response)
        });
    };

Assurez-vous d'avoir la cache: false là-dedans. IE aime tirer les données du cache et vraiment faire un tas de choses.

Sur mon action Index je changé de return View(emailListGrid); à

        if (Request.IsAjaxRequest())
            return PartialView("EmailMaint", emailListGrid);
        else
            return View(emailListGrid);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top