打造可持续发展的事业

事业像系统的框架,要稳定、可扩展,同样需要精心设计的!

DNN开发中的一些细节(2)

上篇文章留下的问题还是很费了我一番劲的!不过搞定后有小小的快感!
老问题
上篇的问题是:如何在Treeview中加上编辑的小图表,而且这个层次数据对应的每个对象都不一样?
达到如下效果:

新问题
由于TreeView的自动绑定,我是通过一个XML的查询得到数据源的,但是发现如果数据源不是所有分支都到根(比如有的分支只有一层)绑定将会因为找不到对应的字段而出错,并且他要求是一个标准的XML文档,就是只能有唯一的根元素。这些都是我不方便保证的。我只好手工遍历该数据来构造数。
考虑到这个树相对变化少,性能的问题不用太担心,再加上我们可以充分利用组件Cache的机制。
        private void CreateTree()
        
{
            
//Create Tree
            MainController ctlMain = new MainController();
            XmlDataSource source 
= new XmlDataSource();
            
string sXMLdata = "<Main>" + ctlMain.GetStoresByXML(0+ "</Main>";

            XmlDocument xdom 
= new XmlDocument();
            xdom.Load(
new StringReader(sXMLdata));

            XmlNode parentNode 
= xdom.FirstChild;

            
foreach (XmlNode node in parentNode.ChildNodes)
            
{
                LoopThroughChild(node,parentNode,
null);//Add Nodes to the tree
            }

            
        }

原来很简单
在TreeView中能够方便加入CheckBox控件,但是一般控件的添加却没有相应的文档说明和实例。在HTML中run at server中也难找到控件插入的地方!
在浏览LoopThroughChild中发现可以动动Node.Text的脑筋了!一试果然很爽:
            if (IsEditable)
            
{
                newNode.Text 
= "<A HREF='" + EditUrl("ItemID", newNode.Value, sCtl) 
                    
+ "'><img src='http://localhost/MyDNN/images/edit.gif' ALT='Edit' BORDER=0 /></A>" 
                    
+ newNode.Text;
            }

熟悉DNN的朋友发现这个和在ASCX中的代码一样。
<asp:HyperLink ID="HyperLink1" NavigateUrl='<%# EditUrl("ItemID",((int)DataBinder.Eval(Container.DataItem,"ID")).ToString()) %>' Visible="<%# IsEditable %>" runat="server"> <asp:Image ID="Image1" Runat="server" ImageUrl="~/images/edit.gif" AlternateText="Edit" Visible="<%# IsEditable%>" resourcekey="Edit"/>  </asp:HyperLink>
          
还需要改进的地方包括:img的src要改成“~/images/edit.gif”;还有这个写法好像会干扰TreeView的Select事件。这些好像都好解决!
至于树上不同层的节点(Node)对应的编辑模块不相同只用在上述代码中给sCtll赋予不同的关键字就可以了,然后在DNN的模块定义中将这些关键字指到不同的EditXXX.ascx就可以了。记得谁问过一View个模块可以对应多个Edit模块吗?答案是可以的。

几个开发中的备忘
(1)DNN中自带的controls/urlcontrol.ascx控件是我经常使用的,比如上传一些图片并指派给某个对象等等。这里头值得注意的是:FileFilter属性不是我们熟悉的*.jgp|*.gif,而是jpg,gif。
(2)图片要显示出来也费了周折。我通过urlControl上去的文件在对应的字段中被记录为“FILEID=22”这样子的。要是需要把它显示出来我的做法是:定义一个Image Web控件,代码部分就如下:
{
string picUrl = objMyDBData.PicURL;
                    picUrl = GetActualFile(picUrl);
                    img.ImageUrl = picUrl;
}

private string GetActualFile(string picUrl)
        {
            if ((picUrl != null) && (picUrl != ""))
            {
                if (picUrl.IndexOf("://") 
<= 0)
                {
                    FileController ctlFile 
= new FileController();
                    int fileID 
= Int32.Parse(picUrl.Substring(7, picUrl.Length - 7));
                    FileInfo fileInfo 
= ctlFile.GetFileById(fileID, this.PortalId);
                    picUrl 
= PortalSettings.HomeDirectory + fileInfo.Folder + fileInfo.FileName;
                }
            }
            return picUrl;
        }




posted on   PM2004  阅读(1919)  评论(8编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
< 2006年4月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 1 2 3 4 5 6

导航

统计

点击右上角即可分享
微信分享提示