Ajax.ActionLink повторяет один и тот же точный GET-запрос несколько раз - PullRequest
2 голосов
/ 21 июля 2011

Я изучаю MVC, и в настоящее время я делаю простую систему отслеживания SCRUM , пока я иду вперед.

Проблема, с которой я столкнулся, заключается в том, что при нажатии Ajax.ActionLink,Я запускаю одно и то же действие ajax один раз для каждой скрам-карты, отображаемой на странице.

enter image description here

Как видите, у меня отображается 9 карт, и я получаю 9 одинаковых запросов GET.(Ссылка действия на самом деле является изображением цветового круга в правом нижнем углу карты).

SingleCard.cshtml (View) - «ColorPicker» - это название моего действия.

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>

...

<div class="card_footer" id="card_footer_id_@(Model.ID)">
    <div class="card_tags">
        [Tag1] [Tag2] [Tag3]
    </div>
    <div class="card_colorwheel_icon">
    @Ajax.ImageActionLink("../Content/Images/color_wheel.png", "Color Wheel", "ColorPicker", new { cardid = Model.ID }, new AjaxOptions { UpdateTargetId = "ColorPickerDisplay" })
    </div>
</div>

ImageActionLink - это помощник, который я использую, но он работает точно так же, как обычный ActionLink

HomeController.cs (Controller)

    public ActionResult ColorPicker(int cardid)
    {
        var currentcard = db.Cards.Single(x => x.ID == cardid);

        var colors = new List<CardRGB>();
        var cards = db.Cards.ToList();
        foreach (var card in cards)
        {
            colors.Add(new CardRGB 
                {
                    CardId = card.ID,
                    Red = (int)card.BG_Red,
                    Blue = (int)card.BG_Blue,
                    Green = (int)card.BG_Green
                });
        }

        // disctint

        var model = new ColorPickerViewModel()
        {
            Colors = colors,
            Red = (int) currentcard.BG_Red,
            Green = (int) currentcard.BG_Green,
            Blue = (int) currentcard.BG_Blue
        };

        return PartialView(model);
    }

Кто-нибудь знает, почему этот код выполняетсяодин раз за карту?

РЕДАКТИРОВАТЬ: По запросу!

public static class ImageActionLinkHelper
{
    public static MvcHtmlString ImageActionLink(
        this AjaxHelper helper,
        string imageUrl,
        string altText,
        string actionName,
        object routeValues,
        AjaxOptions ajaxOptions)
        {
            var builder = new TagBuilder("img");
            builder.MergeAttribute("src", imageUrl);
            builder.MergeAttribute("alt", altText);
            builder.MergeAttribute("title", altText);
            var link = helper.ActionLink("[replaceme]", actionName, routeValues, ajaxOptions);
            var html = link.ToHtmlString().Replace("[replaceme]", builder.ToString(TagRenderMode.SelfClosing));
            return new MvcHtmlString(html);
        }
}

1 Ответ

6 голосов
/ 21 июля 2011

Проверьте HTML-код вашей страницы. В вашем singlecard.cshtml есть строка:

    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>

Для каждой карты вы снова включаете JavaScript, поэтому он включается 9 раз. Поэтому на сервер будет отправлено 9 запросов.

Решение: поместить скрипт-include на уровне страницы, а не на уровне карты.

...