以这种方式实施单页应用程序是不好的做法吗?

时间:2013-08-24 23:01:10

标签: c# asp.net updatepanel postback

好,

所以我创建了这个Web应用程序,它被设计为单页面应用程序。有一个菜单只在一个更新面板中加载各种用户控件之一(设计为表单)(清除控件,加载新控件等)。用户执行任何输入,单击保存,删除等。在这些用户控件中,有几个数据绑定和内部依赖控件,这是我将它们加载到更新面板的主要原因。

现在,我遇到了这个问题,当用户选择新菜单,然后更改数据绑定控件的值时,控件仅在第一次回发时丢失其值。我很确定这是由于清理了用户控件所在的容器,因为我已经尝试清除并加载常规面板,我会遇到完全相同的问题。由于使用(!IsPostBack)在我的情况下不起作用,我只是创建了一个布尔会话变量,在数据绑定方面在页面和用户控件之间执行相同的逻辑。为了进一步测试我的问题,我将应用程序更改为多页面应用程序,问题就消失了;值在回发时保留。

所以,为了达到我原来的观点,我看到使用多个页面的功能;我认为在单页版本中,如果我只是将“Server.Transfer(thedefaultpage.aspx)”添加到代码中,我将保留从多页方法中获得的功能,同时保持用户在同一页面上。它很棒。没有数据丢失,它可以正常工作。这味道不好吗?所有用户功能和职责总是在一个页面上执行,导航不会为他们做任何事情。

我只是担心基本上刷新页面只是不好的做法或hacky,但它适用于应用程序的目的,并且可以在不需要时创建2-3个页面。我已经阅读了一些线程,其中有人会这样做只是为了清除结果,或者是一些小问题,但这就是全部。

如果这是不好的做法(或者即使不是),也许任何人都有第一次回复价值损失的解决方案?我在数据绑定的master,page,usercontrol和child控件上启用了enableviewstate = true和viewstatemode =。提前感谢任何意见。

3 个答案:

答案 0 :(得分:0)

这种做法将来会引发很多问题。我不会这样做

答案 1 :(得分:0)

所以,如果有人遇到同样的问题并且没有合法的解决方法,那么当我回来解决这个问题时,我就“出现”了一天。

第一个回发问题似乎源于容器控件(占位符,面板,更新面板等)的清除和重新填充。当我让用户单击一个菜单项然后清除并将用户控件加载到容器中时,回发时引用的用户控件与正在加载的新控件不同。跟我说说我将如何描述这种情况......

在菜单点击事件触发之前,在初始菜单点击时引用最后加载的用户控件,然后清除容器并从菜单点击事件加载新的用户控件。当容器中没有加载控件(初始启动)时,不会发生这种情况。由于动态添加了用户控件,我有一个方法可以重新加载当前加载的usercontrol,它放在Page_Init中。此事件以及PreInit,_Load都在控制事件之前触发,并且是我的问题的原因。这个修复程序,更明显的经验,就是在usercontrol加载方法和Page_Init(或任何有加载方法的地方)中添加if语句,以确定导致回发的原因。因为,我只希望用户单击菜单项以在众多任务中移动,我只是确保如果菜单项单击导致回发,那么,不要在Init中运行load方法,但是,其他任何东西导致回发(对我而言,仅在用户控件内),Init中的加载方法只会触发。

此外,在load方法中必须使用if语句,以确保新添加的用户控件中的所有控件都包含默认/空值,基本上是您希望用户在首次显示控件时看到的默认值,在我的案件我:

if (Page.Request.Params["_EVENTTARGET"].Contains("Menu1") == true) 
{ 
uc.Clear(null, null);
uc.SetBoundControls();
}

希望这有助于其他人,或者提出更好的解决方案。

答案 2 :(得分:0)

是的,这是不好的做法。随着UI复杂性的增加,WebForms的状态问题会越来越严重。

我将SPA UI状态保留为一个类,该类被序列化为XML并以纯文本形式保存到数据库中。我在URL中使用GUID作为会话密钥(但您可以拥有用户ID,或ASP.NET会话ID,或其他),以便在每个请求上检索此状态信息,从而消除管理状态或丢失数据时出现的任何问题用户刷新页面。

这样做的另一个好处是,您可以通过单元测试覆盖逻辑UI,而不会陷入网络层细节 - 适用于复杂的工作流程。

如果您尝试这样做,我建议您考虑转移到MVC并使用普通的Post-and-Redirect;如果要允许后退按钮,请将哈希标记添加到重定向响应中。