ASP.NET MVC: простенькая задачка

Программирование

Tagged Under : ,

Итак, у вас есть Action контроллера, в котором содержится следующий фрагмент кода:

ViewBag.Test = "test message";
ViewBag.Alert = "alert message";
ViewData["Alert"] = "alert message 2";

ViewBag.Func = new Func<string, string>(x => {
    ViewBag.Test = x;
    x = ViewBag.Alert;
    ViewBag.Alert = (string)ViewData["Alert"];
    return x;
});

И представление следующего вида:

@ViewBag.Func("x")
@ViewData["Test"]
@ViewBag.Alert

Какие строки мы увидим на странице и в какой последовательности? Сначала ответьте себе устно, а потом проверьте запустив.

ASP.NET MVC: HtmlHelper для пейджинга

Программирование

Tagged Under : , , , ,

Напомню пейджинг – это контрол, который служит для навигации между страницами, допустим раздела со списокм новостей. Сие требуется почти на любом сайте и проекте, поэтому оптимальнее всего написать либо контрол либо HtmlHelper для MVC-проектов.

Последнее реализуется достаточно просто, главное – учесть все параметры, которые вам когда -либо нужно будет задавать. Например, я написал следующий хелпер для пейджинга, который и использую:

public static class CustomHelpers
    {
        public static string Paging(this HtmlHelper helper, int page, int itemPrePage, int itemCount, int showItemsCount, string itemTag, string moreText, string nextText, string prevText, string firstText, string lastText, bool IsFirstLast, string pageLinkText, string rootLink, string anchorText)
        {
            int pagesCount = itemCount % itemPrePage == 0 ? itemCount / itemPrePage : itemCount / itemPrePage + 1;
            if ( pagesCount < 2)
                return "";

            StringBuilder sb = new StringBuilder();
            if (IsFirstLast && page > 1)
                sb.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText != null ? "#" + anchorText : "", 1, pageLinkText, firstText);

            if (page > 1)
                sb.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText != null ? "#" + anchorText : "", page - 1, pageLinkText, prevText);

            if (pagesCount <= showItemsCount)
                for (int i = 1; i <= pagesCount; i++)
                    if (i != page)
                        sb.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText != null ? "#" + anchorText : "", i, pageLinkText, i);
                    else
                        sb.AppendFormat("<{1}>{0}</{1}>", i, itemTag);
            else
            {
                for (int i = 1; i <= pagesCount; i += showItemsCount)
                {
                    int end = 0;
                    if (pagesCount < showItemsCount + i)
                        end = pagesCount;
                    else
                        end = i + showItemsCount - 1;
                    if (page >= i && page <= end)
                    {
                        if (page > showItemsCount)
                            sb.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText != null ? "#" + anchorText : "", i - 1, pageLinkText, moreText);

                        for (int j = i; j <= end; j++)
                        {
                            if (j != page)
                                sb.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText != null ? "#" + anchorText : "", j, pageLinkText, j);
                            else
                                sb.AppendFormat("<{1}>{0}</{1}>", j, itemTag);
                        }

                        if (page <= pagesCount - showItemsCount + 1)
                            sb.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText != null ? "#" + anchorText : "", end + 1, pageLinkText, moreText);
                        break;
                    }
                }
            }


            if (page < pagesCount)
                sb.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText != null ? "#" + anchorText : "", page + 1, pageLinkText, nextText);

            if (IsFirstLast && page < pagesCount)
                sb.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText != null ? "#" + anchorText : "", pagesCount, pageLinkText, lastText);
            return sb.ToString();
        }
    }

отмечу, что в приведённом выше коде генерятся только непосредственно элементы навигации, которые вставляются в контейнер (контейнер собственно нужен для определения внешнего вида пейджинга).

Наш ответ RoR или движок блога на ASP.NET за несколько минут

Программирование

Tagged Under : , ,

Решил таки посмотреть, что же такое RoR: к этому меня подвёл случайный разговор с коллегой по работе об его интересе к «рельсам» и о том, что на ASP.NET аналогичное реализовать сложнее и затратнее по времени.

В ходе изучения вышел на известный скринкаст, в котором некто набросал простейший движок блога на RoR примерно за 15 минут.

Посмотрел и подумал, а чем ASP.NET в этом конкретном случае хуже? И сделал аналогичный скринкаст, только с ASP.NET в главной роли, с MVC Framework’ом и Dynamic Data.

Получилось всё также просто и быстро, лично я в очередной раз убедился, что ASP.NET хоть и не является идеальной технологией, но всё же весьма хороша.

ASP.NET MVC + LINQ2SQL: древовидные комментарии

Программирование

Tagged Under : , , ,

Не так давно задумал реализовать один небольшой проект и входе реализации столкнулся с необходимостью реализовать комментирование. Есстественно задумал древовидные комментарии, но даже и не думал, что всё так просто.
Читать дальше »

ASP.NET MVC: загрузка файлов на сервер (ajax)

Программирование

Tagged Under : , , , ,

Итак, рассмотрим ajax-загрузку файлов в mvc. Ситуация здесь не столь безоблачная как при обычной загрузке, но не фатальная.
Читать дальше »

ASP.NET MVC: загрузка файлов на сервер

Программирование

Tagged Under : ,

Просматривая статистику по блогу обнаружил переход со страницы результатов поиска в гугле по запросу «ASP>NET MVC загрузка файлов». Из интереса решил посмотреть что ещё выдается и на втором месте в выдаче обнаруживаю это.
Код, конечно, весьма интересный, но зачем так усложнять?
Читать дальше »

Изменение размеров картинок и фото

Программирование

Tagged Under : , ,

В ходе подготовки ресурса по фурье-спектроскопии, на котором планируется размещать картинки со спектрами, передо мной встал вопрос изменения размеров загруженных картинок таким образом, чтобы они умещались в нужную область генерируемой страницы. Читать дальше »

Генерация Rss и Atom

Программирование

Tagged Under : , , , ,

Казалось бы, что нового в задаче, которую уже все перерешали, в том числе и я, но использование MVC Framework’a для меня нечто относительно новое, поэтому наибольшее затруднение вызвала не генерация лент, а её выдача клиенту. Читать дальше »

ASP.NET MVC: проблемы при размещение проекта на хостинге

Программирование

Tagged Under : , , , ,

Размещать asp.net mvc проект на хостинге пришлось впервые, проекты все без исключения некоммерческие и хостинг для них тоже бесплатный, и как следствие там чаще всего поддержка ASP.NET 2.0, сейчас же masterhost предоставляет бесплатный хостинг для студентов и аспирантов, так что появилась возможность бесплатно попользоваться хостингом с .NET Framework 3.5 sp 1 и поддержкой MVC для создания учебных проектов и вместе с тем столкнуться с рядом проблем.
Читать дальше »

ASP.NET + Webmoney Merchant: проблема с дополнительными параметрами продавца

Программирование

Tagged Under : , , , ,

Не так давно столкнулся с необходимостью реализации оплаты лицензии некоторого ПО. Есстественно, был выбран интерфейса http://merchant.webmoney.ru как наиболее подробно описанный, доступный и удобный. И всё бы ничего, если бы не одно «НО»… Читать дальше »