如何将ASPX Web窗体上的所有控件转换为只读等效项
有没有人写过一个可以将aspx页面上的所有控件转换为只读版本的函数?例如,如果使用UserDetails.aspx编辑和保存用户信息,则如果权限不当的人进入该页面,我希望将其呈现为只读。因此,大多数控件将转换为标签,并从可编辑的原始控件中加载相应的数据。
我认为这可能是一个相当简单的例程,即:
Dim ctlParent As Control = Me.txtTest.Parent Dim ctlOLD As TextBox = Me.txtTest Dim ctlNEW As Label = New Label ctlNEW.Width = ctlOLD.Width ctlNEW.Text = ctlOLD.Text ctlParent.Controls.Remove(ctlOLD) ctlParent.Controls.Add(ctlNEW)
...实际上是我们需要一个文本框->标签转换的全部,但是我希望有人可能知道那里的现有功能,因为在某些控件和情况下可能会出现一些陷阱。
更新:
仅将ReadOnly属性设置为true并不是可行的解决方案,因为看起来像这样呈灰色的东西看起来很愚蠢。
整个过程的重点是避免手动创建辅助视图,因此我试图避免使用巧妙的方式来显示使用标签手动构建的用户界面的只读版本。
谢谢!!
解决方案
回答
我们可以使用多视图,只有一个显示视图和一个编辑视图..然后按以下方式进行分配:
lblWhatever.Text = txtWhatever.Text = whateverOriginatingSource; lblSomethingElse.Text = txtSomethingElse.Text = somethingElseOriginatingSource; myViews.SelectedIndex = myConditionOrVariableThatDeterminesEditable ? 0 : 1;
然后根据权限交换视图。
不是最优雅,但可能会适合情况。
也许我应该详细说明一下..撤消伪指令(不确定我是否正确使用了selectedindex yada yada ..但我们明白了)。
<asp:Multiview ID="myViews" SelectedIndex="1"> <asp:View ID="EditView"> <asp:TextBox ID="txtWhatever" /><br /> <asp:TextBox ID="txtSomethingElse" /> </asp:View> <asp:View ID="DisplayView"> <asp:Label ID="lblWhatever" /><br /> <asp:Label ID="lblSomethingElse" /> </asp:View> </asp:Multiview>
回答
如何创建自己的控件库,如果ReadOnly为true,则呈现不同的控件。就像是:
MyTextBox : TextBox { public override void RenderControl(HtmlTextWriter writer) { if (this.ReadOnly) { writer.WriteBeginTag("label"); writer.Write(this.Value); writer.WriteEndTag(); } } }
有一种方法可以使用web.config用我们自己的控件替换所有asp:TextBox实例,而无需编辑到my:TextBox,但是我在查找参考ATM时遇到了麻烦。
否则,我可能只是写一个jQuery代码片段来做到这一点。
回答
我不知道任何现有功能,但是自己处理控件并不难。我们需要担心的大事情是控件树中的非ASP.NET控件。 (例如)
我们可以将控件的大小写更改为适当的类型,然后检查是否为空,然后正确处理每个控件。
回答
缺少编写自己的控件的方法,恐怕我们不想走的路线(制作第二个仅用于标签的页面)可能是一条非常不错的路线,仅仅是因为我们不希望运行Firebug的人可以编辑使用HTML即时关闭我们所拥有的任何控件,并像使用他们有权更新该页面一样使用该页面。
回答
使用DetailsView。根据页面的当前模式,它可以完全满足要求。
回答
斯科特·米切尔(Scott Mitchell)不久前就此发表了一篇很好的文章。
http://aspnet.4guysfromrolla.com/articles/012506-1.aspx
过去,我一直将此方法与"只读"字段中的CSS结合使用,以使它们的外观和工作方式完全像标签,即使它们实际上是文本框。