我试图创建一个专门用于练习的乐器零售网站。总结一下我的项目,基本上客户可以浏览选择的工具,而管理员可以访问我在网站上尝试做的内容管理系统。然后,管理员可以添加或删除新旧产品,并通过Gridview概述所有项目。
我的CMS的一般想法是,例如我有吉他品牌叫做#34; Ibanez"和#34; Fender"(每个人都有他们自己的Griview,因为他们的数据库是分开的)。我创建了一个网页,管理员需要填写文本框中的所有必要详细信息,以便在" Ibanez"和#34; Fender"或者用新物品创造一个全新的品牌。如果管理员已完成信息,只需点击保存,最后新品牌或新产品将出现在网站上。因此,如果管理员想要创建一个名为" Gibson"的新品牌,那么该程序应该会在我网站的概述部分自动为该品牌创建一个gridview。
现在为了实现这一切,我所做的是当管理员点击保存以创建新的品牌或产品时,我创建了一个代码,用于修改/编写某些项目文件中的新代码。它甚至被编程为仅通过添加.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.。)如何在不修改/编写项目文件的情况下实现上述想法?
OR
2。)如果我要继续我以前的方法。如果我想删除我在文件中自动实现的新代码而没有得到表明该进程仍在使用的异常的情况下使用什么算法?
答案 0 :(得分:1)
CMSes通常将内容存储在数据库或文件系统中。代码(即.cs
或.aspx
文件)不应存储内容,它应仅包含程序逻辑。
建议:
将您的内容存储在有效的XML文件中。例如:
<?xml version="1.0" encoding="UTF-8"?>
<brands>
<brand name="Gibson">
<items>
...
</items>
</brand>
</brands>
从ASP.NET程序中读取XML文件并将其反序列化为对象。另请参阅此MSDN主题:https://msdn.microsoft.com/en-us/library/58a18dwa(v=vs.110).aspx。
GridView
或一般说您的网页。FileSystemWatcher
的更多信息:https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx 实施这些内容之后,您的网站不再依赖于内容的代码,而是每次使用内容更新XML文件时都会更新。然后,您可以探索如何将此信息存储在数据库中,以便您可以实现一些后端管理页面来管理内容(就像大多数CMS一样)。