C# 从业务逻辑中引用ASP.NET控件

C# 从业务逻辑中引用ASP.NET控件,c#,asp.net,webforms,C#,Asp.net,Webforms,在我的页面中,我有一个文本框txtMyInfo。我还有一个单独的业务逻辑类,我用它来管理页面上的内容。如何从业务逻辑类中的方法引用txtMyInfo。我可以通过页面对象引用控件吗?我看不到推荐人 public void MyBusinessLogic(Page page){ page.Controls.txtMyInfo.Text=""; } 试试看 如果这样做,您可能必须引用hte控件的实际类。您还可以使用FindControl,它会更通用一些,但也会起作用 public void

在我的页面中,我有一个文本框txtMyInfo。我还有一个单独的业务逻辑类,我用它来管理页面上的内容。如何从业务逻辑类中的方法引用txtMyInfo。我可以通过页面对象引用控件吗?我看不到推荐人

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


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

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

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

业务逻辑不应在您的UI上运行。你最终会得到一个很大的项目背后的代码

您应该尝试并熟悉一个称为“关注点分离”的概念:

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

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’s pattern d’Jour”的东西)。把你的顾虑分开就足够了

编辑:虽然此答案不能直接回答您关于如何从UI外部引用控件的问题,但它通过向您展示一种根本不必这样做的方法来间接回答您的问题

我还有一个单独的业务逻辑 我用来整理东西的类 在页面上。我怎么说 中的方法的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; }
    }

    // ...
}
//接口定义
公共伊斯兰教教团
{
字符串关键字{get;set;}
int ItemsPerPage{get;set;}
点击操作搜索按钮;
// ...
}
//实施
公共搜索表单:ISearchForm
{
公共字符串关键字
{
获取{return txtKeywords.Text;}
设置{txtKeywords.Text=value;}
}
// ...
}

界面应该向控制器类公开页面的有趣部分。

如果要分离业务逻辑,为什么要直接引用UI对象?尝试使用MVC模式。如果您使用的是WebForms,请使用MVP模式。这是一个很好的观点,我将对此进行研究。不管怎样,我仍然需要掌握控制引用。谢谢,你的例子很清楚。如果您添加了一些关于控件引用的内容(我可能在其他地方需要它),那么您就解决了我的问题并回答了我的问题。我是说您应该完全避免它。除此之外,引用控件与使用对它的引用一样简单。其他人对此发表了文章,但您不应该需要从任何地方引用控件,而应该从UI引用控件,因为您似乎已经知道如何引用。即使冒着得不到公认答案的风险,我也不会让这种编程永久化。。。有一天我可能不得不处理您的代码:)如果您在页面生命周期中过早调用MyBusinessLogic(),这可能会发生。你什么时候打电话?也检查一下这个。。。
// 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; }
    }

    // ...
}