Удалить ссылку с помощью jquery подтвердите в приложении Asp.Net MVC 2 - PullRequest
2 голосов
/ 23 августа 2010

У меня есть таблица с записями, в которой есть ссылки для удаления. По сути, я следовал руководству по NerdDinner для этой части в MVC. Но я не хочу иметь представление подтверждения, я бы предпочел иметь диалоговое окно подтверждения, а затем, если оно подтверждено, пусть метод действия HttPost удалит запись напрямую.

У меня что-то работает, но, будучи новичком в MVC и jQuery, я не уверен, правильно ли я это делаю.

Вот jQuery:

    $(function () {
        $('.delete').click(function () {
            var answer = confirm('Do you want to delete this record?');
            if (answer) {
                $.post(this.href, function () {
                    window.location.reload(); //Callback
                });
                return false;
            }
            return false;
        });
    });

И удалить ссылку действия:

<%: Html.ActionLink("Delete", "Delete", new { id = user.UserID }, new { @class = "delete" })%>

И, наконец, метод действия удаления:

    [HttpPost]
    public ActionResult Delete(int id)
    {
        _db = new UsersEntities();
        try
        {
            //First delete the dependency relationship:
            DeleteUserVisits(id);
            //Then delete the user object itself:
            DeleteUser(id);
        }
        catch (Exception)
        {
            return View("NotFound");
        }

        return RedirectToAction("Index");
    }

Теперь у меня есть несколько вопросов по этому поводу:

  1. В интернете я нашел функцию создания ссылки POST вместо GET: `$ .post (this.href); вернуть ложь; И я не уверен, что делает «возврат ложного». Я попытался изменить его для своих нужд с помощью обратного вызова и так далее, и сохранил возвращаемую часть, не зная, для чего она нужна.

  2. Во-вторых, у метода действия есть атрибут HttpPost, но я также где-то читал, что вы можете использовать глагол удаления. Тебе следует? А как насчет RedirectToAction? Первоначально целью было обновить страницу, но это не сработало, поэтому я добавил вместо этого window.location.reload в обратный вызов в jQuery. Есть мысли?

  3. Метод действия Delete вызывает несколько вспомогательных методов, поскольку, как представляется, с помощью Entity Framework, который я использую для данных, я не могу просто удалить запись, если она имеет зависимости отношений. Я должен был сначала удалить отношения, а затем саму запись "Пользователь". Это прекрасно работает, но я бы подумал, что можно будет просто удалить запись, и все отношения будут автоматически удалены ...?

  4. Я знаю, что вы не должны просто удалять ссылки напрямую, потому что сканеры и т. Д. Могут случайно удалить записи. Но с jQuery, есть ли проблемы с безопасностью с этим? Краулеры не могли этого сделать, когда между ними проходит проверка jQuery, верно?

Любые разъяснения будут с благодарностью!

Ответы [ 3 ]

2 голосов
/ 23 августа 2010
  1. Оператор return false служит та же цель, что и e.preventDefault() в этом случае. Возвращая ложный JavaScript, это мешает браузер от выполнения ссылки обработчик щелчков по умолчанию.

  2. Глагол DELETE предназначен для веб-сайтов RESTful. услуги, это скорее всего не то, что Вы хотите в этой ситуации, потому что не все браузеры полностью реализуют это. Подробнее о них читайте здесь: Создание веб-службы RESTful с использованием ASP.Net MVC

  3. Правила удаления для ребенка сущности зависят от сущности Правила OnDelete / OnUpdate в определение контекста, а также на ограничения внешнего ключа в база данных. Вы можете узнать больше о ограничения внешнего ключа здесь .

  4. Искатель не сможет активировать ссылку для удаления в этом мода, потому что вы указали действие удаления будет выполнено через СООБЩЕНИЕ. Если удаление было GET, то это было бы проблемой. Тем не менее, это не разумно хранить ссылки, которые напрямую изменить свой контент на фронтальной страницы, которые не требуют аутентификация как человек мог больше всего конечно, использовать процесс.

1 голос
/ 11 апреля 2011

Если вы также хотите бросить диалог jQuery на вечеринку, этот пост Рикардо Ково отлично справится с работой

enter image description here

1 голос
/ 23 августа 2010

Вот, пожалуйста, с полным кодом:

http://haacked.com/archive/2009/01/30/delete-link-with-downlevel-support.aspx

Или только вспомогательный html:

public static string DeleteLink(this HtmlHelper html, string linkText, string routeName, object routeValues) {
    var urlHelper = new UrlHelper(html.ViewContext.RequestContext);
    string url = urlHelper.RouteUrl(routeName, routeValues);

    string format = @"<form method=""post"" action=""{0}"" class=""delete-link"">
    <input type=""submit"" value=""{1}"" />
    {2}
    </form>";

    string form = string.Format(format, html.AttributeEncode(url), html.AttributeEncode(linkText), html.AntiForgeryToken());

    return form + html.RouteLink(linkText, routeName, routeValues, new { @class = "delete-link", style = "display:none;" });
}

На ваши вопросы:

  1. Когда вы возвращаете false в конце обработчика щелчков JavaScript по ссылке, браузер выполняет javascript, но не переходит по ссылке из-за возврата false.

  2. Для (максимальной) кросс-браузерной совместимости не следует использовать глагол DELETE.

  3. Я недостаточно хорошо знаю EF, но разве он не обеспечивает конфигурацию отображения для каскадного удаления?

  4. HTTP GET следует использовать только для получения информации, например, для предоставления параметров для поиска. Сканеры обычно не заботятся о javascript, поэтому они будут слепо переходить по ссылкам. Если это http://mysite/delete/everything,, то это плохо для вас, если у вас не было [HttpPost] на вашем контроллере действия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...