Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以这种方式实现单页应用程序是一种不好的做法吗?_C#_Asp.net_Updatepanel_Postback - Fatal编程技术网

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

C# 以这种方式实现单页应用程序是一种不好的做法吗?,c#,asp.net,updatepanel,postback,C#,Asp.net,Updatepanel,Postback,好, 所以我创建了这个web应用程序,它被设计成一个单页应用程序。有一个菜单,它只在一个更新面板中加载各种用户控件(设计为窗体)中的一个(清除控件、加载新控件等)。用户执行任何输入操作,单击保存、删除等。在这些用户控件中,有几个数据绑定控件和内部相关控件,这是我将它们加载到更新面板中的主要原因 现在,我遇到了这样一个问题:当用户选择一个新菜单,然后去更改一个数据绑定控件的值时,该控件只在第一次回发时丢失其值。我很确定这是由于清除了usercontrol所在的容器,因为我已经尝试过清除和加载一个常

好,

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

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

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

我只是担心从本质上刷新页面只是一种不好的做法或黑客行为,但它可以用于应用程序的目的,并且可以避免在不必要时创建2-3打页面。我读过一些帖子,其中有人这样做只是为了清除结果,或者做一些次要的事情,但仅此而已


如果这是一种糟糕的做法(或者即使不是),也许有人能找到解决第一次回发价值损失的方法吗?我在数据绑定的主控件、页控件、用户控件和子控件上启用了enableviewstate=true和viewstatemode=enabled。提前感谢您的任何意见。

这种做法将来会导致很多问题。我不喜欢这样做,所以,如果有人遇到同样的问题,并且没有合法的解决办法,我会在前几天回来解决这个问题时“想出”一个

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

在触发菜单单击事件之前,上次加载的usercontrol在初始菜单单击上被引用,然后清除容器并从菜单单击事件加载新的usercontrol。如果容器中没有加载控件(初始启动),则不会发生这种情况。由于usercontrols是动态添加的,我有一个方法可以重新加载当前加载的usercontrol,它被放置在Page_Init中。这个事件,连同PreInit,_Load,所有在控制事件之前触发的事件,都是我的问题的原因。正如更多经验所表明的那样,修复方法是向usercontrol加载方法和Page_Init(或任何有加载方法的地方)添加if语句,以确定导致回发的原因。因为,我只希望用户点击菜单项在众多任务中移动,我只是确保如果菜单项点击导致回发,那么,不要在Init中运行load方法,但是,任何导致回发的事情(对我来说,仅在用户控件中),Init中的load方法只会在那时触发

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

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


希望这能帮助其他人,或者激发出一种更好的解决方案。

是的,这是一种不好的做法。WebForms的状态问题随着UI复杂性的增加而不断恶化

我使用一个序列化为XML并以纯文本形式保存到数据库的类来保持SPA UI状态。我使用URL中的GUID作为会话密钥(但您可以使用用户id或ASP.NET会话id,或其他任何内容)在每个请求中检索此状态信息,这消除了在用户刷新页面时管理状态或丢失数据的任何问题

这样做还有一个额外的好处,即允许您使用单元测试覆盖逻辑UI,而不必纠结于web层的详细信息,这对于复杂的工作流是很好的

如果你尝试这个,我建议你考虑移动到MVC并使用简单的旧帖子和重定向;如果希望允许“后退”按钮,请向重定向响应添加哈希标记