需要帮助删除这个fudged代码...绑定用户控制回发

时间:2011-12-23 13:56:48

标签: asp.net data-binding user-controls

根据标题,我知道我在下面发布的代码是完全便便,这就是我需要你帮助的原因!

我已经花了太多时间进入这个问题,而且要么缺乏经验,还有一个错误,或者我已经搞砸了。

我有一个用户控件,其中包含一个访问ViewState的视图属性,以及两个用户控件,用于显示属性。

在用户控件的page_load中,根据某些属性的值,它将切换控件的可见性:

public partial class PatientStatus : System.Web.UI.UserControl
{
    public string PatientName { get { return ViewState["PatientName"] as string; } set { ViewState["PatientName"] = value; } }
    public bool ClinicianView { get { return Convert.ToBoolean(ViewState["ClinicianView"]); } set { ViewState["ClinicianView"] = value; } }
    public string RangeTitle { get { return ViewState["RangeTitle"] as string; } set { ViewState["RangeTitle"] = value; } }
    public int? RangeLimitNormSys { get { return ViewState["RangeLimitNormSys"] as int?; } set { ViewState["RangeLimitNormSys"] = value; } }
    public int? RangeLimitNormDia { get { return ViewState["RangeLimitNormDia"] as int?; } set { ViewState["RangeLimitNormDia"] = value; } }

    protected void Page_Load(object sender, EventArgs e)
    {
        bool ispostback = IsPostBack;
        if (ispostback && ((System.Web.UI.WebControls.Repeater)(this.Parent.Parent)).DataSource != null)
        {
            object itm = ((RepeaterItem)this.Parent).DataItem;
            if (itm is AppointmentRow)
            {
                AppointmentRow row = itm as AppointmentRow;
                PatientName = row.Name;
                RangeTitle = row.Range;
                RangeLimitNormDia = row.RangeLimitNormDia;
                RangeLimitNormSys = row.RangeLimitNormSys;
                ispostback = false;
            }
            else if (itm is ReadingRow)
            {
                ReadingRow row = itm as ReadingRow;
                PatientName = row.Name;
                RangeTitle = row.Range;
                RangeLimitNormDia = row.RangeLimitNormDia;
                RangeLimitNormSys = row.RangeLimitNormSys;
                ispostback = false;
            }
            else if (itm is PatientRow)
            {
                PatientRow row = itm as PatientRow;
                PatientName = row.Name;
                RangeTitle = row.Range;
                RangeLimitNormDia = row.RangeLimitNormDia;
                RangeLimitNormSys = row.RangeLimitNormSys;
                ispostback = false;
            }
        }
        if (!ispostback)
        {
            if (!string.IsNullOrWhiteSpace(RangeTitle))
            {
                placeHolder.Visible = true;
                literalNA.Visible = false;
            }
        }
    }
}

以前,Page_Load事件只包含:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        if (!string.IsNullOrWhiteSpace(RangeTitle))
        {
            placeHolder.Visible = true;
            literalNA.Visible = false;
        }
    }
}

但是在回发时,RangeTitle属性始终为null,因此即使删除isPostBack语句,它也不起作用。

解决问题的唯一方法是通过第一段代码真正捏造它。

在父页面的Page_Load上,然后在!isPostBack上调用一个获取数据并将数据绑定到转发器的方法。这很好用。但是在回发中,我调用相同的方法,由于某种原因,用户控件不会填充。

任何想法?

圣诞快乐

GAV株系

修改

回应@jwiscarson

我有一个通过ASP:Repeater生成的表,在ItemTemplate中,我添加了一个包含PlaceHolder和Literal的用户控件。用户控件中还有许多属性。

然后在数据绑定中,我将多个值传递给用户控件(我已尝试使用Eval的OnItemDataBound和内联)。然后在User Control的Page_Load事件中,根据上面的第二个代码块,我首先检查它是否是回发,如果没有,我然后检查Property RangeTitle是否有值。

如果RangeTitle没有值,我会隐藏包含HTML的占位符,该HTML将显示RangeTitle并显示一个显示N / A的文字。

第一次加载页面时,(!isPostBack)工作正常。但是一旦我创建了一个回发,转发器中的用户控件都会恢复为N / A,即使它们的RangeTitle属性有值。

在调试时,我在User Control的Page_Load中设置了一个断点。当我第一次加载页面时,我可以看到我的属性已正确填充。然后在回发时,在UserControl上调用Page_Load并正确填充属性,然后再次调用Page_Load,但这次属性为空。

!的IsPostBack UserControl :: Page_Load<正确的数据

的IsPostBack UserControl :: Page_Load<正确的数据 myButton_Click(绑定新数据) UserControl :: Page_Load<没有数据

让事情变得更加混乱。在myButton_Click中调用以绑定数据的方法,就是在Page的Page_Load中调用的完全相同的方法,用于填充转发器!isPostBack

谢谢;)

1 个答案:

答案 0 :(得分:0)

我会检查以确保此函数中可以访问DataItem。我认为您需要收听ItemDataBound事件并在该事件中执行此工作。

除此之外,很难提出具体的其他建议。我真的不明白为什么你正在做你正在做的事情(如果你在Repeater中有这些信息,为什么它也需要在ViewState?)。如果你能解释你这样做的理由,它可能会帮助我和其他任何访问这个问题的人。你说你只是想在页面上显示/隐藏一些特定的项目。这是非常复杂的代码,没有很多合理性的理由。

顺便说一句:你真的,真的需要打破这些代码并思考你想要实现的目标。以下是一些建议:

  1. ifelse if语句中的范围分隔为返回所需数据的函数。
  2. 请勿在{{1​​}}语句中包含((System.Web.UI.WebControls.Repeater)(this.Parent.Parent)).DataSource != null等行。单独执行此转换并将其存储在变量中,或者编写一个小函数来检查它。
  3. 在我看来,像if这样的语句和对this.Parent.Parent控件的其他引用都是代码味道。即使在普通网页上,这也会产生代码异味,但是当您将Parent包含在this.Parent中时,UserControl究竟会引用什么?