2017-02-21 25 views
0

Я пытаюсь создать розничный сайт музыкальных инструментов только для практики. Чтобы обобщить мой проект, в основном клиент может просматривать выбор инструментов, а администратор имеет дополнительный доступ к системе управления контентом, которую я пытаюсь сделать на веб-сайте. Затем администратор может добавлять или удалять новые/старые продукты, а также просматривать все элементы через Gridview.Как создать систему управления контентом с помощью asp.net?

Общая идея моей CMS, например, у меня есть гитарные бренды под названием «Ibanez» и «Fender» (каждый из которых имеет свой собственный Griview, поскольку их база данных разделена). Я создал веб-страницу, где администратору потребуется заполнить все необходимые данные внутри текстового поля, чтобы создать элемент в «Ibanez» и «Fender» или создать совершенно новый бренд с новыми элементами. Если администратор уже закончил с информацией, просто нажмите «Сохранить» и, наконец, новый бренд или новый продукт появится на веб-сайте. Итак, допустим, если администратор хочет создать новый бренд под названием «Gibson», программа автоматически создаст gridview для этого бренда в разделе обзора моего веб-сайта.

Теперь, чтобы достигнуть всего этого, я сделал, когда админы удалили save для создания новых брендов или продуктов, я создал код, в котором он будет модифицировать/писать новый код в некоторых файлах проекта. Он даже запрограммирован на создание новых файлов, просто добавив расширение .cs или .aspx, а затем просто будет использовать streamwriter для создания нового кода внутри нового файла.

Вот пример моего кода, где вы пишете новый код в файле:

var gridViewLines = File.ReadAllLines(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\OverviewGuitarData.aspx"); 
    var _gridViewLines = new List<string>(gridViewLines); 
    int index = counter; 
    index -= 1; 

    _gridViewLines.Insert(index++, ""); 
    _gridViewLines.Insert(index++, " <h3>"+brand_name+" Guitar Items Data</h3>"); 
    _gridViewLines.Insert(index++, " <div style=\"overflow:auto; width:1100px; max-height:500px;\">"); 
    _gridViewLines.Insert(index++, "  <asp:GridView ID=\"Guitar" + brand_name + "GridView\" runat=\"server\" CssClass=\"mydatagrid\" PagerStyle-CssClass=\"pager\" HeaderStyle-CssClass=\"header\" RowStyle-CssClass=\"rows\" AllowPaging=\"True\" AllowSorting=\"True\" AutoGenerateColumns=\"False\" CellPadding=\"3\" CellSpacing=\"3\" DataKeyNames=\"id\" DataSourceID=\"SqlDataSource"+brand_number+"\" OnRowDataBound=\"Guitar"+brand_name+"GridView_RowDataBound\" Height=\"250px\" Width=\"864px\">"); 
    _gridViewLines.Insert(index++, "   <Columns>"); 
    _gridViewLines.Insert(index++, "    <asp:TemplateField>"); 
    _gridViewLines.Insert(index++, "    <ItemTemplate>"); 
    _gridViewLines.Insert(index++, "      <asp:Button ID=\"Guitar"+brand_name+"GridViewBtn\" runat=\"server\" Text=\"Delete\" OnClick=\"Guitar"+brand_name+"GridViewBtn_Click\"/>"); 
    _gridViewLines.Insert(index++, "    </ItemTemplate>"); 
    _gridViewLines.Insert(index++, "    </asp:TemplateField>"); 
    _gridViewLines.Insert(index++, "    <asp:CommandField ButtonType=\"Button\" ShowEditButton=\"True\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"id\" HeaderText=\"id\" ReadOnly=\"True\" SortExpression=\"id\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"type\" HeaderText=\"type\" SortExpression=\"type\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"model\" HeaderText=\"model\" SortExpression=\"model\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"price\" HeaderText=\"price\" SortExpression=\"price\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"image1\" HeaderText=\"image1\" SortExpression=\"image1\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"image2\" HeaderText=\"image2\" SortExpression=\"image2\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"description\" HeaderText=\"description\" SortExpression=\"description\" ItemStyle-Wrap=\"false\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"neck_type\" HeaderText=\"neck_type\" SortExpression=\"neck_type\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"body\" HeaderText=\"body\" SortExpression=\"body\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"fretboard\" HeaderText=\"fretboard\" SortExpression=\"fretboard\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"fret\" HeaderText=\"fret\" SortExpression=\"fret\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"bridge\" HeaderText=\"bridge\" SortExpression=\"bridge\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"neck_pickup\" HeaderText=\"neck_pickup\" SortExpression=\"neck_pickup\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"bridge_pickup\" HeaderText=\"bridge_pickup\" SortExpression=\"bridge_pickup\" />"); 
    _gridViewLines.Insert(index++, "     <asp:BoundField DataField=\"hardware_color\" HeaderText=\"hardware_color\" SortExpression=\"hardware_color\" />"); 
    _gridViewLines.Insert(index++, "    </Columns>"); 
    _gridViewLines.Insert(index++, "   </asp:GridView>"); 
    _gridViewLines.Insert(index++, "  </div>"); 


    gridViewLines = _gridViewLines.ToArray(); 
    File.WriteAllLines(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\OverviewGuitarData.aspx", gridViewLines); 

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

Вот код для удаления какой-нибудь текст в файле:

public static void SearchRemove() 
    { 
     int counter = 0; 
     string line; 

     // Read the file and display it line by line. 
     System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\OverviewGuitarData.aspx"); 
     while ((line = file.ReadLine()) != null) 
     { 
      if (line.Contains(" <h3>Gibson Guitar Items Data</h3>")) 
      { 
       break; 
      } 
      counter+=1; 
     } 
     file.Close(); 
     Remove(counter); 

    } 


    public static void Remove(int counter) 
    { 


       int removeAt = counter;//or any thing you want 
       removeAt -= 1; 
       int linesToRemove = 70; //or any thing you want 
       string s = System.IO.File.ReadAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\OverviewGuitarData.aspx"); 
       List<string> arr = s.Split("\n".ToCharArray()).ToList(); 

       string result = ""; 
       for (int i = 0; i < linesToRemove; i++) 
       { 
        arr.RemoveAt(removeAt); 
        result = ""; 
        foreach (string str in arr) 
        { 
         result += str + "\n"; 
        } 

        System.IO.File.WriteAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\OverviewGuitarData.aspx", result); 
       } 
      } 


    }    

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

1.) Как достичь вышеуказанной идеи без изменения/записи файла проекта?

ИЛИ

2.) Если я буду продолжать свой прежний подход. Какой алгоритм использовать, если я хочу удалить новый код, который я автоматически внедрил в файл, не получая исключение, указывающее, что этот процесс все еще используется?

ответ

1

CMS обычно хранят контент в базе данных или в файловой системе. Код (т. Е. .cs или файл .aspx) не должен хранить содержание, он должен содержать только программную логику .

Предложения:

  1. Храните ваше содержание в действительный файл XML. Пример:

    <?xml version="1.0" encoding="UTF-8"?> 
    <brands> 
        <brand name="Gibson"> 
         <items> 
          ... 
         </items> 
        </brand> 
    </brands> 
    
  2. Прочитайте файл XML из программы ASP.NET и десериализации его в объект. См. Также эту тему MSDN: https://msdn.microsoft.com/en-us/library/58a18dwa(v=vs.110).aspx.

  3. Заполните GridView или вообще ваши страницы с содержимым, которое вы только что извлекли из файла XML.
  4. Установите наблюдателя на файл XML, чтобы при изменении его содержимого вы могли обновлять свои объекты и визуализировать новые данные на своем веб-сайте. Посмотреть более подробную информацию о FileSystemWatcher на MSDN: https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx

Внедрив эти вещи, ваш сайт не будет зависеть от кода для содержания, вместо этого, он будет обновляться каждый раз при обновлении файла XML с содержимым. Затем вы можете изучить, как сохранить эту информацию в базе данных, чтобы вы могли реализовать некоторую внутреннюю страницу администратора для управления содержимым (как это делает большинство CMS).

+0

отличные ссылки! Я определенно займусь этим. Кстати, я нашел ответ на вопрос №2. Оказывается, мне просто нужно переключить некоторые методы, чтобы избежать исключения. Это все еще не так, но я думаю, этого будет достаточно, пока я все еще изучаю вопрос №1. – BrunoEarth