Разработка
05
Апр
7

Пример создания ASPX-странички для CRM

Картина про разработку различных программных дополнений для MS CRM была бы не полной без рассказа об ASPX-приложениях (в дополнение к Введению в разработку плагинов для Microsoft CRM 4.0 и Примеру разработки кастомного бизнес-процесса). Так что рассмотримка небольшой пример создания кастомного представления с помощью ASPX-страницы:

  • Откройте Visual Studio 2008 и создайте новый проект — Web Site — в диалоговом окне выберите ASP.NET Web Site и введите имя проекта. В правом верхнем углу, в ниспдающем списке выберите .NET Framework 3.0 (или 3.5). Нажмите OK. Visual Studio добавит страницу default.aspx и web.config к Вашему решению;
  • Как и все программные компоненты (плагины и workflow, например), обращающиеся к сервису MS CRM, ASPX-приложения должны использовать сборки из Microsoft CRM SDK. Поэтому необходимо добавить ссылки на них: щелкните правой кнопкой мыши по «References» и выберите «Add Reference» — в диалоговом окне «Add Reference» перейдите к вкладке к Browse и выберите папку bin в CRM SDK — выберите microsoft.crm.sdk.dll и microsoft.crm.sdktypeproxy.dll и нажмите OK;



  • На страничку Default.aspx вставьте такой код:
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title>Йоу</title>
        <link href="StyleSheet.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <div class="header">
            <!-- Большой заголовок -->
            Кастомная вьюха
            <div class="headerdetail">
                <!-- Описание под заголовком -->
                Какое-то описание формы
            </div>
        </div>
        <!-- Заголовки кастомного представления -->
        <table class="gridHeader">
            <tr>
                <td width="5%"></td>
                <td width="18%"><b>Название</b></td>
                <td width="12%"><b>Основной телефон</b></td>
                <td width="15%"><b>Электронная почта</b></td>
                <td width="15%"><b>Страна</b></td>
                <td width="15%"><b>Регион</b></td>
                <td width="13%" id="last"><b>Город</b></td>
                <td width="2%" id="last"><img src="http://mmcrm.ru/_imgs/grid/grid_Refresh.gif" /></td>
            </tr>
        </table>
        <form id="form1" runat="server">
        <div>
            <div class="griddiv">
                <!-- Поля представления: имена полей используются в коде в *.aspx.cs -->
                <asp:GridView ID="gridData" DataKeyNames="accountid" runat="server" Width="100%"
                    AutoGenerateColumns="False" ShowHeader="False">
                    <Columns>
                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:Literal ID="RadioButtonMarkup" runat="server" ><img src="http://mmcrm.ru/_imgs/ico_16_1.gif"  /></asp:Literal>
                            </ItemTemplate>
                            <ItemStyle Width="5%" HorizontalAlign="Center" />
                        </asp:TemplateField>
                        <asp:BoundField DataField="name">
                            <ItemStyle Width="18%" />
                        </asp:BoundField>
                        <asp:BoundField DataField="MainPhone">
                            <ItemStyle Width="12%" />
                        </asp:BoundField>
                        <asp:BoundField DataField="Email">
                            <ItemStyle Width="15%" />
                        </asp:BoundField>
                        <asp:BoundField DataField="Сountry">
                            <ItemStyle Width="15%" />
                        </asp:BoundField>
                        <asp:BoundField DataField="State">
                            <ItemStyle Width="15%" />
                        </asp:BoundField>
                        <asp:BoundField DataField="City">
                            <ItemStyle Width="15%" />
                        </asp:BoundField>
                        <asp:BoundField DataField="accountid" Visible="False" />
                    </Columns>
                </asp:GridView>
            </div>
            <!-- Кнопки под представлением -->
            <div align="right">
                <asp:Button ID="Button2" runat="server" Text="Добавить" CssClass="aspbutton" />
                <input type="button" id="Button1" onclick="closewindow();" value="Отмена" class="aspbutton" />
            </div>
        </div>
        </form>
    </body>
    </html>
    

    Этот код определяет HTML-элементы нашей ASPX-странички. Здесь присутствуют: заголовок формы и ее описание, таблица отвечающаея за формирование ячеек-заголовков кастомного представление, таблца самого представления (точнее контрол GridView, который на выходе и формирует HTML-таблицу из набора данных) и две кнопки под представлением!

  • Для страницы Default.aspx.cs код будет таким:
    using System;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using Microsoft.Crm.Sdk;  
    using Microsoft.Crm.SdkTypeProxy;  
    using Microsoft.Crm.Sdk.Query;  
    using System.Net;
    
    public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
     
            CrmAuthenticationToken myToken = new CrmAuthenticationToken();
            myToken.OrganizationName = "superfirma";
            /*
            Тип аутентификации
            0 – Active Directory
            1 – MS CRM Dynamics Live
            2 – IFD
            */
            myToken.AuthenticationType = 0;
            CrmService crmService = new CrmService();
            // Передаем учетные данные админа, чтобы соединится с API веб-служб MS CRM
            crmService.Credentials = new NetworkCredential("Administrator", "1qaz@WSX", "d2008");
            // URL CRM Service'а
            crmService.Url = "http://WIN-N22HJ23D1B1/MSCrmServices/2007/CrmService.asmx";
            crmService.CrmAuthenticationTokenValue = myToken;
    
            // Оперделяем запрос, который будет отправлен в Сrm Service
            QueryExpression query = new QueryExpression();
            
            // Поля которые необходимо вернуть...
            ColumnSet colsPrincipal = new ColumnSet();
            colsPrincipal.Attributes.Add("name");
            colsPrincipal.Attributes.Add("accountid");
            colsPrincipal.Attributes.Add("telephone1");
            colsPrincipal.Attributes.Add("emailaddress1");
            colsPrincipal.Attributes.Add("address1_country");
            colsPrincipal.Attributes.Add("address1_stateorprovince");
            colsPrincipal.Attributes.Add("address1_city");
    
            query.ColumnSet = colsPrincipal;
            query.EntityName = EntityName.account.ToString();
    
            // Отправляем запрос в Сrm Service
            BusinessEntityCollection accounts = crmService.RetrieveMultiple(query);
    
            // Определяем Dataset и DataTable
            DataSet ds = new DataSet();
            DataTable dt = new DataTable();
    
            // Задаем поля для DataTable - должны быть идентичны полям GridView
            dt.Columns.Add("name");
            dt.Columns.Add("MainPhone");
            dt.Columns.Add("Email");
            dt.Columns.Add("Сountry");
            dt.Columns.Add("State");
            dt.Columns.Add("City");
            dt.Columns.Add("accountid");
    
            // Просматриваем все возвращенные строки и помещаем каждую из них в DataTable
            foreach (BusinessEntity Account in accounts.BusinessEntities)
            {
                account a = (account)Account;
                DataRow dr = dt.NewRow();
                dr["name"] = a.name;
                dr["MainPhone"] = a.telephone1;
                dr["Email"] = a.emailaddress1;
                dr["Сountry"] = a.address1_country;
                dr["State"] = a.address1_stateorprovince;
                dr["City"] = a.address1_city;
                dr["accountid"] = a.accountid.Value;
                dt.Rows.Add(dr);
            }
    
            ds.Tables.Add(dt);
    
            // Помещаем возвращенные данные из DataSet в GridView
            gridData.DataSource = ds;
            gridData.DataBind();
        }
    }
    

    Это обыный .Net-код написанный на языке C#. А выполняет он следующее:

    • Сначала происходит подключение к API CRM Service под учеткой админа;
    • Затем формируем запрос (с полями которые необходимо вернуть) и отправляем в CRM Service;
    • Просматриваем полученный результат и заносим его в DataTable;
    • Ну и в последнуюю очеред помещаем возвращенные данные в GridView.
  • Теперь щелкните правой кнопкой по заголовку проекта Solution Explorer и выберите Add New Item. В открывшемся диалоговом окне выберите Style Sheet. Создасться файл каскадных таблиц стилей — добавьте в него такой код:
    BODY
    {
    	background-color: #eaf3ff;
    }
    /* Большой заголовок */
    .header
    {
    	font-family: Tahoma;
    	font-size: 11pt;
    	font-weight: Bold;
    	padding-left: 10px;
    	padding-top: 10px;
    	background-color: #6693cf;
    	margin-bottom: 20px;
    	color: #ffffff;
    }
    /* Описание под заголовком */
    .headerdetail
    {
    	font-size: 10pt;
    	font-weight: normal;
    	padding-bottom: 10px;
    }
    /* Заголовки кастомного представления */
    .gridHeader
    {
    	border: 1px solid;
    	border-collapse: collapse;
    	width: 100%;
    	height: 21px;
    	background-color: #f0f0f0;
    	border-color: #a7cdf0 #a7cdf0 #999999 #a7cdf0;
    	font-family: Tahoma;
    	font-size: 11px;
    	font-weight: normal;
    }
    
    .gridHeader td
    {
    	border: 0px solid blue;
    	border-collapse: collapse;
    	background: url(http://mmcrm.ru/_imgs/grid/resize.gif) right no-repeat;
    	padding-left: 3px;
    }
    
    #last 
    {
    	background-image: none;
    }
    /* Поля представления */
    #gridData
    {
    	border-bottom: 1px solid #a7cdf0;
    	border-left: 1px solid #a7cdf0;
    	border-right: 1px solid #a7cdf0;
    	border-top: 0px;
    	border-collapse: collapse;
    	font-family: Tahoma;
    	font-size: 11px;
    	font-weight: normal;
    }
    
    #gridData td
    {
    	background-color: #FFFFFF;
    	border: 0px;
    	border-bottom: 1px solid #abcdef;
    	border-collapse: collapse;
    	height: 16px;
    	padding-left: 3px;
    }
    /* Кнопки под представлением */
    .aspbutton
    {
    	font-size: 11px;
    	font-family: Tahoma;
    	height: 20px;
    	width: 84px;
    	text-align: center;
    	cursor: pointer;
    	border: 1px #3366CC solid;
    	background-color: #CEE7FF;
    	margin-top: 15px;
    }
    
    form
    {
    	padding: 0px;
    	margin: 0px;
    }
    



  • ASPX-страничка готова 🙂 сейчас нужно ее опубликовать! Создайте в папке inetpub новую папку (например, с именем grid). Поместите в эту папку основные файлы проекта: *.aspx, *.aspx.cs, *.css и web.config;
  • Откройте менеджер IIS — щелкните правой кнопкой по папке Sites и выберите Add Web Site. Задайте параметры нового веб-сайта:
    • Имя сайта: на Ваш вкус, но чтобы описывало суть нового сайта 🙂
    • Путь к папке в inetpub, в которую вы скопировали файлы проекта;
    • Порт нового сайта: этот порт будет использоваться в URL (дописываться к имени компютера или mmcrm.ru’у через двоеточие).
  • Нуссс 🙂 все готово для тестирования 🙂 введите в адресной строке браузера URL такого вида: http://<CRM_сервер>:<порт> 🙂



Комментарии (7)
  • a33ik 05.04.2010

    Интересно. Спасибо.

    А как насчёт примера когда страница располагается по тому же порту, что и CRM? Как уйти от хардкодинга креденшиалов и имперсонироваться со страницы, именно как тот пользователь, который эту страницу открывает?

  • Vladislav Osmanov 05.04.2010

    В SDK есть ещё «\stylesheet\template.css» и sample.htm. CRM’ную кнопку можно «красивой» так сделать (CSS):
    filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#B4C5DF, EndColorStr=#91A9D0);

    2 a33ik: поместить проект (страничку) в ISV директорию CRM и в web.config для него указать:

    ?

  • Егор 05.04.2010

    «А как насчёт примера когда страница располагается по тому же порту, что и CRM? Как уйти от хардкодинга креденшиалов и имперсонироваться со страницы, именно как тот пользователь, который эту страницу открывает?» — присоединяюсь, расскажите пожалуйста как сделать кастомную страницу и вызвать ее со страницы CRM а также передать и забрать с нее данные. Заранее очень благодарен

  • slivka_83 05.04.2010

    Для CRM 4.0 что-нибудь типа (но я не уверен):

    // Подключаемся к CRM-сервису
            CrmAuthenticationToken token = new CrmAuthenticationToken();
            token.AuthenticationType = 0; //Active Directory
            token.OrganizationName = "superfirma";
            CrmService crmService = new CrmService();
            crmService.Url = "http://win-n22hj23d1b1/mscrmservices/2007/crmservice.asmx";
            crmService.UseDefaultCredentials = true;
            crmService.PreAuthenticate = true;
            crmService.CrmAuthenticationTokenValue = token;
    
  • Владимир 05.04.2010

    По хорошему для получения токена необходимо использовать статический метод ExtractAuthenticationToken класса CrmAuthenticationToken а урлу брать из реестра.

    Хардкодинг — зло.

  • Taker 05.04.2010

    Не могли бы вы сказать где находится страничка aspx, отвечающая за представления или хотя бы её название? Найти не могу( Проблема такая возникла, что CRM загружает старую версию css, то есть изменения внесенные в appgrid.css.aspx не отображаются. Поэтому решил добавить напрямую в страницу. CRM 4.0
    Заранее спасибо!

  • slivka_83 05.04.2010

    В CRM много CSS… стили в них каскадные… одни переопределяют другие. В общем открываете Ваше представление, жмете F12 — выделяете представление — а далее на вкладке Стиль отслеживаете откуда (из каких CSS) эти стили берутся/ Ну, а дальше пытаетесь в них подправить 🙂 а после того как подправите попробуйте очистит кэш 🙂

*

code