ASP.NET MVC: Установка SAPE кода на сайте

ru-RU | создано: 11.08.2012 | опубликовано: 11.08.2012 | обновлено: 31.12.2017 | просмотров за всё время: 7549

В этой короткой статье я покажу как можно установить SAPE код на своем сайте, который работает на ASP.NET MVC.

Могу предположить, что вы уже попытались самостоятельно установить SAPE-код на своем сайте и, наверняка, уже попытались найти найти информацию на основном форуме этой системы. У меня не получилось найти чего-то более и менее разумного. Пришлось обращаться к автору сборки, который любезно подсказал, что надо делать всё “вручную”.

Настройка конфигурации (web.config)

Для начала в секцию “configSections” добавляем настройку sape-библиотеки (см. строки с 8 по 13):

<configuration>
    <configSections>
        <section name="entityFramework" 
                 type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,
                        EntityFramework, Version=4.3.1.0, Culture=neutral, 
                        PublicKeyToken=b77a5c561934e089" />

        <sectionGroup name="effetto.Sape">
            <section name="SapeConfig" type="effetto.Sape.SapeConfigSection, SAPE" 
                    allowLocation="true" 
                    requirePermission="false" 
                     allowDefinition="Everywhere"/>
        </sectionGroup>

    </configSections>
    
    <!-- много другого полезного кода настроек -->
    
</configuration>

После этого перед секцией “system.web” (хотя можно и после нее, главное чтобы в эту ветку конфигурации) помещаем код:

<effetto.Sape>
   <SapeConfig UserId="[ваш код пользователя]">
       <DefaultDocuments>
           <add Name="/site/index" />
       </DefaultDocuments>
   </SapeConfig>
</effetto.Sape>

Хотя в принципе, можно этот код не размещать, так если только на случай открыть конфигурации и вспомнить какой у вас код. Я в конечной реализации удалил второй код, и всё равно всё заработало.

Создаем свой ActionResult для SAPE

Чтобы реализовать рендеринг SAPE-ссылок на ASP.NET MVC надо создать свой собственный результат обработки запроса (ActionResult). Я назвал свой класс SapeLinksResult. Для начала добавил необходимые пространства имен:

using System.Web.Mvc;
using effetto.Sape;

Далее сам код класса SapeLinksResult. Я покажу весь код целиком, чтобы проще было копировать:

public class SapeLinksResult : ActionResult
{
    private SapeUrl url;
    private SapePage page;
    private SapeHost host;

    public string UserId { get; private set; }

    public string HostName { get; private set; }

    public SapeLinksResult(string userId, string hostname)
    {
        if (String.IsNullOrEmpty(userId)) 
            throw new ArgumentNullException("userId");
        if (String.IsNullOrEmpty(hostname)) 
            throw new ArgumentNullException("hostname");
        this.UserId = userId;
        this.HostName = hostname;

        url = new SapeUrl();

        SapeUser user = SapeFactory.Factory.GetUser(this.UserId);
        host = user.GetHost(hostname);
        page = host.GetPage(url);
    }

    public override void ExecuteResult(ControllerContext context)
    {
        HttpResponseBase response = context.HttpContext.Response;
        HttpRequestBase request = context.HttpContext.Request;
        List<SapeLink> links = null;
        if (page != null)
        {
            links = page.GetLinks();

            if (links != null)
            {
                foreach (SapeLink link in links)
                {
                    response.Write(link.RawLink + host.Delimiter);
                }
            }
        }
    }
}

Использование нового SapeLinksResult

Чтобы использовать данный класс перейдем в контроллер (мой называется Home) и добавим новый метод SapeCode. Сам метод прост до безобразия, обратите внимание на атрибут над методом – это важно.

[ChildActionOnly]
public ActionResult SapeCode()
{
    return new SapeLinksResult("ваш_идентификационный_номер_SAPE", "вашсайт.ру");
}

Не забудьте указать свой идентификационный номер в системе SAPE и доменное имя вашего сайта. На основании этих данных и будут загружаться ссылки для страниц.

Теперь надо вызвать этот метод на тех страницах, где вы хотели бы разместить SAPE-ссылки. Также можно разместить в главном шаблоне сайта, и тогда код будет отрабатывать на всех страницах вашего сайта.

<p class="code">
     @Html.Action("sapecode", "home")
</p>

Вот, собственно говоря и всё. Пробуйте, у меня получилось, чего и вам желаю.

Комментарии к статье (12)

11.08.2012 12:26:02 Павел Эффетто

Спасибо большое за исследовательский мануал, надеюсь он многим поможет!

Хочу заметить, что указанный подход реализует только базовый функционал, но 90% площадок его хватает.

11.08.2012 13:20:46 Calabonga

Павел Эффетто, именно такую задачу и ставил перед собой. Дальше можно будет и больше впендюрить, если потребуется... :)

14.08.2012 2:43:20 AntonG

Thanks guys for the idea, I have alsso published a widget for the Orchard CMS here: https://gallery.orchardproject.net/List/Modules/Orchard.Module.SapeModule

Regards,

Anton.

29.05.2017 4:28:04 operator

немогу понять

SapeConfig UserId="[ваш код пользователя]"

где брать код пользователя?

19.09.2012 5:26:07 Calabonga

код пользователя выдается при регистрации в системе SAPE

13.10.2012 20:02:38 Димка

Приветствую!

Спасибо за подробные статьи! Таких мало.

Не могли бы подсказать как правильно кнопку твитнуть вставить на сайт (mvc 3)

Я везде на html+php  использую обычный код твитера, вот такой prokomputer.ru/wp-content/uploads/twitter.txt

а в mvc  Вставляю его в вьюху страницы, он не работает, видать там как то по особому нужно оформить скрипт...

спасибо

фух, еле отправил каммент, если нажать чекбокс подписаться, то идет прогресс и все

03.11.2012 2:40:16 Calabonga

Димка, к счастью я ничего не знаю про PHP, и к сожалению, не смогу вам помочь

01.11.2013 13:27:59 Андрей

SapeUser user = SapeFactory.Factory.GetUser(this.UserId);

получаю ошибку, что Ссылка на объект не указывает на экземпляр объекта

21.08.2014 10:20:22 Владимир

Спасибо. Работает

30.11.2015 19:47:32 alvi

Сделал по вашей методике, но все равно получаю "Код на сайте не установлен". Как вообще можно понять глюк ли это sape или это я где-то накосячил?

public override void ExecuteResult(ControllerContext context)
        {
            HttpResponseBase response = context.HttpContext.Response;
            if (page == null) return;
            if (content == null) //simple links
            {
               List<SapeLink> links = null;
               links = page.GetLinks();
               if (links != null)
                    foreach (SapeLink link in links)
                        response.Write(link.RawLink + host.Delimiter);
            }
            else //context links
            {
               response.Write(page.MakeContextLinks(content));
            }       

 

22.02.2017 12:58:46 антон

Добрый день!
А есть ли способ установить код sape для приложений на asp.net core&
Спасибо!

22.02.2017 15:17:12 Calabonga

Да, планируется в ближайшее время разработка под Asp.net core