【问题标题】:How can I "Refactor => introduce a variable" inside an ascx\Eval code?如何在 ascx\Eval 代码中“重构 => 引入变量”?
【发布时间】:2015-07-28 10:49:29
【问题描述】:

我有一些代码太复杂了

visible='<%#((String.IsNullOrEmpty(Eval("IDLingua").ToString()) [...]%>' runat="server">

我想引入一个变量来保存 String.IsNullOrEmpty(Eval("IDLingua").ToString() 操作的结果。

我可以在 Ascx 代码或后面的代码中执行此操作。但是经过几个小时的研究,我仍然不清楚该怎么做

【问题讨论】:

    标签: asp.net vb.net eval ascx


    【解决方案1】:

    这看起来像是应该在 UI 之外的逻辑。您可以向包含逻辑的对象 IsVisible 添加一个新属性

    visible='<%#Eval("IsVisible")%>' runat="server">
    

    或者在后面的代码中创建一个函数并调用它

    visible='<%#IsVisible(Eval("IDLingua"))%>' runat="server">
    

    【讨论】:

    • 这已经是一个不错的解决方案,但我可以直接从后面的代码访问 IDLingua 吗?我想尽可能地将视图与控制器分开。如果后面的代码能看到 IDLingua 我早就解决了。
    • @Revious 在第二个例子中,IDLingua 作为参数传递,函数不需要知道值来自哪里。在第一个示例中,该类负责所有逻辑,因此只有该类知道 IDLingua。
    • 但是如何从后面的代码访问 IDLingua? (我发布的所有代码都在转发器内)
    【解决方案2】:

    您不能将这样的对象分配给简单的变量。

    visible='<%#((String.IsNullOrEmpty(Eval("IDLingua").ToString())
    [...]%>' runat="server">
    

    一般来说,我不建议在 aspx 视图上处理数据。在我看来,如果你在代码后面甚至更早的代码中处理它会更好(在从数据库中获取数据和在后面的代码中准备视图之间)。视图应该是最小的并且只呈现数据,而不是处理它。

    无论如何...我猜你的 Eval 代码存在于中继器或另一个使用数据绑定器的控件中。

    您应该能够定义其他隐藏字段控件并将表达式保存在那里。

    <asp:HiddenField id="hidTmp" runat="server" value='<%# String.IsNullOrEmpty(Eval("IDLingua").ToString() %>' />
    

    但请记住,它只能在 &lt;ItemTemplate&gt; 标记内使用。你可以使用 hidTmp 作为变量。

    另一种方法可能是使用OnItemDataBound 方法并使用后面的代码(引入变量不是问题):

    https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.onitemdatabound(v=vs.110).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      相关资源
      最近更新 更多