【问题标题】:Referring to ASP.NET controls from Business Logic从业务逻辑引用 ASP.NET 控件
【发布时间】:2009-10-12 18:36:10
【问题描述】:

在我的页面中,我有一个文本框 txtMyInfo。我还有一个单独的业务逻辑类,用于操作页面上的内容。如何从业务逻辑类中的方法引用 txtMyInfo。我可以通过页面对象引用控件吗?我没有看到参考。

public void MyBusinessLogic(Page page){
    page.Controls.txtMyInfo.Text="";
}

【问题讨论】:

  • 如果是分离业务逻辑,为什么要直接引用UI对象呢?尝试使用 MVC 模式。
  • 或者,如果您使用 WebForms,请使用 MVP 模式。 msdn.microsoft.com/en-us/library/cc304760.aspx
  • 这是一个很好的观点,我会研究一下。无论如何,我仍然需要掌握控制参考。

标签: c# asp.net webforms


【解决方案1】:

业务逻辑不应在您的 UI 上运行。你最终会得到一个项目中本质上是代码隐藏的大球。

您应该尝试熟悉一个名为“关注点分离”的概念: http://en.wikipedia.org/wiki/Separation_of_concerns

在这种情况下,您真的希望您的业务逻辑更像这样:

public static class MyBusinessLogicClass
{
     public static string GetMyInfo()
     {
          return string.Empty;
     }
}

在您的 UI 代码中,现在您将拥有:

public void Page_Load(object sender, EventArgs e)
{
     txtMyInfo.Text = MyBusinessLogicClass.GetMyInfo();
}

它将帮助您完全避免这个问题。

编辑:我还想指出,您使用什么模式并不重要(请注意,在我的示例中,我没有使用 MVC、MVP 或“Joe 模式D'Jour”)。只需将您的关注点分开就足够了。

Edit Edit:虽然这个答案没有直接回答您关于如何从 UI 外部引用控件的问题,但它通过向您展示了一种避免必须这样做的方法来间接回答这个问题这个

【讨论】:

  • 谢谢,你的例子很清楚。如果您添加了一些关于控件引用的内容(我可能在其他地方需要),那么您将解决我的问题并回答我的问题。
  • 我是说你应该完全避免它。除此之外,引用控件就像使用对它的引用一样简单。其他人已经发布了关于此的内容,但您永远不需要从任何地方引用控件,除了 UI,您似乎已经知道如何去做。即使冒着得不到被接受的答案的风险,我也不会延续这种编程......有一天我可能不得不处理你的代码:)
【解决方案2】:

试试……

TextBox txtInfo = (TextBox)page.FindControl("txtMyInfo");

【讨论】:

【解决方案3】:

我也有单独的业务逻辑 我用来操作东西的类 在页面上。我如何参考 txtMyInfo 中的方法 业务逻辑类。

如果您尝试实现 MVC 模式,您几乎永远不会直接通过 BL 类修改 UI。相反,为它创建一个接口,例如:

// Interface definition
public ISearchForm
{
    String Keywords { get; set; }
    int ItemsPerPage { get; set; }
    Action<string> SearchButtonClicked;
    // ...
}

// Implementation
public SearchForm : ISearchForm
{
    public String Keywords
    {
        get { return txtKeywords.Text; }
        set { txtKeywords.Text = value; }
    }

    // ...
}

您的界面应该将页面中有趣的部分暴露给您的控制器类。

【讨论】:

    【解决方案4】:

    您可以只使用一个 TextBox 参数并传入 TextBox 而不是 Page。

    【讨论】:

      【解决方案5】:

      如果您这样做,您可能必须引用实际的 hte 控件类。您还可以使用 FindControl,它会更通用一些,但可以工作

      public void MyBusinessLogic(Page page){
          page.findcontrol("txtMyInfo").Text="";
      }
      

      【讨论】:

        猜你喜欢
        • 2011-12-03
        • 2011-09-03
        • 1970-01-01
        • 2017-08-08
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 2021-02-24
        • 1970-01-01
        相关资源
        最近更新 更多