如何使用ASP.NET 实现Post-Redirect-Get模式?
按钮单击执行一些处理:
<asp:Button id="bbLaunch" OnCommand="bbLaunch_Click" />
Run Code Online (Sandbox Code Playgroud)
用户点击按钮,启动航天器,重新显示网页.如果用户按下F5,他们会收到警告:

该问题的解决方案是Post-Redirect-Get模式.
PRG可以在ASP.NET中实现的方法是什么?
问题围绕以下问题:
<asp:Button>执行一个POST不是原始形式的地方?Response.Redirect(Request.RawUrl);Server.Transfer.使用Server.Transfer是完全错误的,决不会解决Post-Redirect-Get问题(因为没有重定向).正确?aspx或aspx.cs文件中必须进行哪些代码更改?据推测,至少,代码必须改为post其他地方MyPage.aspx.换句话说:你如何在ASP.net中进行重定向后获取?
注意:ASP.net(即不是ASP.net MVC) …
我遇到了更新存储过程的问题.错误是:
UPDATE失败,因为以下SET选项具有不正确的设置:'QUOTED_IDENTIFIER'.验证SET选项是否正确,以便与计算列和/或查询通知和/或xml数据类型方法的索引视图和/或索引一起使用.
SQL状态:42000本
机错误:1934
遗憾的是,此表没有索引视图,计算列或查询通知.这个存储过程在过去几天运行良好,并且从今天起一直在返回此错误.
是否有任何建议有助于确定问题?
注:如果我设置quoted_identifier到ON并重新运行CREATE PROCEDURE,这个问题将是固定的(现在).但我想先了解是什么引发了这个问题.
我正在使用一个用于创建数据库连接的小例程:
public DbConnection GetConnection(String connectionName)
{
ConnectionStringSettings cs= ConfigurationManager.ConnectionStrings[connectionName];
DbProviderFactory factory = DbProviderFactories.GetFactory(cs.ProviderName);
DbConnection conn = factory.CreateConnection();
conn.ConnectionString = cs.ConnectionString;
conn.Open();
return conn;
}
Run Code Online (Sandbox Code Playgroud)
然后我开始研究.NET框架文档,看看各种事物的记录行为是什么,看看我是否可以处理它们.
例如:
ConfigurationManager.ConnectionStrings...
Run Code Online (Sandbox Code Playgroud)
该文件说,打电话的ConnectionStrings抛出一个ConfigurationErrorException如果无法检索集合.在这种情况下,我无法处理此异常,所以我会放手.
下一部分是ConnectionStrings的实际索引,以查找connectionName:
...ConnectionStrings[connectionName];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,ConnectionStrings文档说如果找不到连接名,该属性将返回null.我可以检查是否发生了这种情况,并抛出一个例外,让某人高兴他们给了一个无效的connectionName:
ConnectionStringSettings cs=
ConfigurationManager.ConnectionStrings[connectionName];
if (cs == null)
throw new ArgumentException("Could not find connection string \""+connectionName+"\"");
Run Code Online (Sandbox Code Playgroud)
我重复同样的练习:
DbProviderFactory factory =
DbProviderFactories.GetFactory(cs.ProviderName);
Run Code Online (Sandbox Code Playgroud)
该GetFactory方法对如果指定一家工厂发生了什么没有文档ProviderName找不到.它没有记录返回null,但我仍然可以防御,并检查 null:
DbProviderFactory factory = …Run Code Online (Sandbox Code Playgroud) 假设程序集dll:
using Microsoft.SqlServer.Server;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System;
using System.Text;
namespace CLRFunctions
{
public class T
{
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static String NormalizeString(String s, String normalizationForm)
{
NormalizationForm form = NormalizationForm.FormC;
if (String.Equals(f, "FormD", StringComparison.OrdinalIgnoreCase))
form = NormalizationForm.FormD;
return = s.Normalize(form);
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意:将程序集目标指向.NET 3.5,因为SQL Server不支持.NET 4.0
将程序集复制到一个位置,"创建"程序集工作正常:
CREATE ASSEMBLY CLRFunctions FROM 'c:\Program Files\My App\CLRFunctions.dll';
Run Code Online (Sandbox Code Playgroud)
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO …Run Code Online (Sandbox Code Playgroud) 为什么64位Windows在异常期间不能展开堆栈,如果堆栈跨越内核边界 - 当32位Windows可以?
整个问题的背景来自:
消失的OnLoad异常 - x64中的用户模式回调异常的情况
在32位Windows中,如果我在我的用户模式代码中抛出异常,那是从内核模式代码调用的,这是从我的用户模式代码调用的,例如:
User mode Kernel Mode
------------------ -------------------
CreateWindow(...); ------> NtCreateWindow(...)
|
WindowProc <---------------------+
Run Code Online (Sandbox Code Playgroud)
Windows中的结构化异常处理(SEH)可以展开堆栈,通过内核模式展开回到我的用户代码,在那里我可以处理异常,并且我看到有效的堆栈跟踪.
64位版本的Windows无法执行此操作:
由于复杂的原因,我们无法在64位操作系统(amd64和IA64)上传播异常.自从Server 2003的第一个64位版本发布以来,情况一直如此.在x86上,情况并非如此 - 异常通过内核边界传播,并最终将帧移回
由于在这种情况下无法回溯可靠的堆栈跟踪,因此必须做出决定:让您看到非荒谬的异常,或者完全隐藏它:
当时的内核架构师决定采用保守的AppCompat友好方法 - 隐藏异常,并希望最好.
本文接着讨论了所有64位Windows操作系统的表现如何:
但是从Windows 7(和Windows Server 2008)开始,架构师改变了主意 - 有点像.对于仅 64位应用程序(不是32位应用程序),它们(默认情况下)会停止抑制这些用户内核用户异常.所以,默认情况下,在:
所有64位应用程序都会看到这些异常,他们从来没有看到它们.
在Windows 7中,当本机x64应用程序以这种方式崩溃时,将通知 …
windows 64-bit structured-exception windows64 windows-appcompat-platform
这是一个通用的数据库设计问题 - 在简单的视图中,在数据库开发中使用同义词有什么好处?在两者之间进行选择时要记住哪些主要考虑因素?
示例视图:
CREATE VIEW Users AS
SELECT * FROM IdentitySystem.dbo.Users
Run Code Online (Sandbox Code Playgroud)
和同等的同义词:
CREATE SYNONYM Users
FOR IdentitySystem.dbo.LCTs
Run Code Online (Sandbox Code Playgroud) 这不是一个笑话的设置,我真的在问.
Douglas Crockford喜欢说在javascript原型面向对象语言中没有必要new.
他解释说,这new只是为了让人们从基于类(即" 经典 ")的面向对象编程语言中获得某种程度的安慰:
JavaScript,我们很难
new雅JavaScript是一种原型语言,但它有一个
new运算符,试图使它看起来有点像经典语言.这往往会使程序员感到困惑,从而导致一些有问题的编程模式.您永远不需要
new Object()在JavaScript中使用.请改用对象文字{}.
好的:
new 坏 {} 好但是后来评论者VítorDeAraújo指出这两者并不相同.他给出了一个例子,表明a string不像object:
字符串对象和字符串值不是同一个东西:
Run Code Online (Sandbox Code Playgroud)js> p = "Foo" Foo js> p.weight = 42 42 js> p.weight // Returns undefined js> q = new String("Foo") Foo js> q.weight = 42 42 js> q.weight 42字符串值不能具有新属性.同样的事情对其他类型也有效.
这里发生了什么string不是一个object?我是否混淆了javascript与其他一些语言,其中一切都是对象?
所有 Page_Load事件完成后是否会触发事件?
我怎么能有一个以上
Page_Load?
当您有用户控件时.
在我的页面可以渲染之前,我需要我的页面(以及所有嵌入式控件)通过完成他们的Page_Load事件来初始化自己.
当然,问题是如果我把代码放在我的页面Page_Load处理程序中:
MyPage.aspx
--> Page_Load
---> DoSomethingWithUserControl()
UserControl1.ascx
--> Page_Load
---> initialize ourselves now that viewstate has been restored
Run Code Online (Sandbox Code Playgroud)
然后我开始UserControl1在准备好之前访问我的控件.
我需要一种方法来在所有Page_Load事件被触发后运行代码,但在任何回发事件(例如Click事件)被触发之前:
MyPage.aspx
--> Page_Load
UserControl1.ascx
--> Page_Load
---> initialize ourselves now that viewstate has been restored
MyPage.aspx
--> Page_AfterLoad
---> DoSomethingWithUserControl()
Run Code Online (Sandbox Code Playgroud)
查看MSDN中的页面生命周期,看起来在完成所有Page_Loads 后无法引发事件:

有没有一种方法后,引发后,所有Page_Loads已经完成?
如何将SQL Server datetime值转换为datetimeoffset值?
例如,现有表包含datetime全部处于"本地"服务器时间的值.
SELECT TOP 5 ChangeDate FROM AuditLog
ChangeDate
=========================
2013-07-25 04:00:03.060
2013-07-24 04:00:03.073
2013-07-23 04:00:03.273
2013-07-20 04:00:02.870
2013-07-19 04:00:03.780
Run Code Online (Sandbox Code Playgroud)
我的服务器(恰好)(现在,今天)比UTC晚了四个小时(现在,在美国东部时区,夏令时处于活动状态):
SELECT SYSDATETIMEOFFSET()
2013-07-25 14:42:41.6450840 -04:00
Run Code Online (Sandbox Code Playgroud)
我想将存储的datetime值转换为datetimeoffset值; 使用服务器的当前时区偏移信息.
我想要的价值观是:
ChangeDate ChangeDateOffset
======================= ==================================
2013-07-25 04:00:03.060 2013-07-25 04:00:03.0600000 -04:00
2013-07-24 04:00:03.073 2013-07-24 04:00:03.0730000 -04:00
2013-07-23 04:00:03.273 2013-07-23 04:00:03.2730000 -04:00
2013-07-20 04:00:02.870 2013-07-20 04:00:02.8700000 -04:00
2013-07-19 04:00:03.780 2013-07-19 04:00:03.7800000 -04:00
Run Code Online (Sandbox Code Playgroud)
你可以看到理想的特征:
2013-07-19 04:00:03.7800000 -04:00
--------------------------- …Run Code Online (Sandbox Code Playgroud) 将表单设置为WindowState = wsMaximized有时会使表单最大化但不会:

长期错误:这是我在2003年首次在Borland新闻组中提出的一个问题:
然后在2006年:
然后在2008年再次:
有人在2012年的Embarcadero论坛上提出这个问题:
现在是时候将18岁的bug移植到Stackoverflow了.也许某人终于想出了一个解决方法.
重现的步骤:
我的帖子包含了六种失败模式,但最简单的是:
删除表单上的a Label和Edita:

为以下内容添加OnEnter活动TEdit:
procedure TForm1.Edit1Enter(Sender: TObject);
begin
Label1.Font.Style := Label1.Font.Style + [fsBold];
end;
Run Code Online (Sandbox Code Playgroud)并设置表格:
WindowState到wsMaximizedAutoScroll为假而bazinga,失败了.
2008年帖子的另一组步骤之一:
- 创建一个新的应用程序和一个表单.
- 在设计时将表单设置为最大化(WindowState = wsMaximized).
- 删除窗体上的ListView控件
在OnShow期间,将20个空项添加到列表视图中:
Run Code Online (Sandbox Code Playgroud)procedure TForm1.FormShow(Sender: TObject); var i: Integer; begin for i := 1 to 20 do ListView1.Items.Add; end;在设计时将表单的AutoScroll属性设置为false(AutoScroll = False)
当然,我没有追求的是"在n …