是否可以检查我们的代码是否在集成管道模式下执行?
有一些ASP.NET类属性只能在集成管道模式下工作,如果有办法测试我们的代码是否在该环境中执行,我想避免引发异常.
因此,我在处理Microsoft Surface的Web应用程序时遇到了一个有趣的问题.
我想在用户与DOM元素交互时添加事件监听器.现在我能做到:
if ('ontouchstart' in document.documentElement) {
//Attach code for touch event listeners
document.addEventListener("touchstart" myFunc, false);
} else {
//Attach code for mouse event listeners
document.addEventListener("mousedown" myFunc, false);
}
Run Code Online (Sandbox Code Playgroud)
如果设备没有鼠标输入,这个问题很简单,上面的代码就可以了.但Surface(和许多新的Windows 8计算机)同时具有触摸和鼠标输入.因此,上述代码仅在用户触摸设备时才有效.永远不会附加鼠标事件侦听器.
那么我想,好吧,我可以这样做:
if ('ontouchstart' in document.documentElement) {
//Attach code for touch event listeners
document.addEventListener("touchstart" myFunc, false);
}
//Always attach code for mouse event listeners
document.addEventListener("mousedown" myFunc, false);
Run Code Online (Sandbox Code Playgroud)
不支持触摸的设备不会附加事件,但使用触摸的设备将注册其处理程序.但问题是myFunc()在触摸设备上会被调用两次:
myFunc() 当"touchstart"被提出时会触发我的直觉反应是否定的,因为托管和非托管内存是截然不同的,但我不确定.NET Framework是否在幕后操作Marshaling.
我认为发生的是:从我的非托管DLL获取结构时,它与使调用获取IntPtr然后使用它和Marshal类将结构复制到托管内存(以及对托管中的结构所做的更改)相同记忆不要起泡).
我似乎无法在MSDN上的任何地方找到此文档.任何链接将不胜感激.
这是我的代码的样子:
[DllImport("mydll.dll", BestFitMapping=false, CharSet=CharSet.Ansi)]
private static extern int GetStruct(ref MyStruct s);
[StructLayout(LayoutKind.Sequential, Pack=0)]
struct MyStruct
{
public int Field1;
public IntPtr Field2;
}
public void DoSomething()
{
MyStruct s = new MyStruct();
GetStruct(ref s);
s.Field1 = 100; //does unmanaged memory now have 100 in Field1 as well?
s.Field2 = IntPtr.Zero; //does unmanaged memory now have a NULL pointer in field Field2 as well?
}
Run Code Online (Sandbox Code Playgroud) 有没有办法检测输入(type = text)元素的内容(值)是否超过其大小?
在Internet Explorer中,scrollWidth属性将大于style.width此时的属性.但是在Firefox中,scrollWidth总是等于style.width并且是一个已知的错误(https://bugzilla.mozilla.org/show_bug.cgi?id=343143),也许不是bug,因为Mozilla根本不认为输入元素是"可滚动的" ,但仍然.根据这种观点,Firefox的textarea元素scrollWidth在内容溢出边界时正确设置属性.
目前,我唯一的想法是:(a)使用textarea元素,并以某种方式将其限制为单行输入或(b)在输入的每个keyup事件中,将内容复制到类似形状的div元素并查看其scrollWidth属性.
在FF中有没有更好的方法来实现这一目标?
我的目标是在用户默认浏览器中安全地打开网页.此网页的URL被视为"不受信任"(将其视为使用此软件打开的文档中的链接,但该文档可能来自任何地方,其中的链接可能是恶意的)
我想避免有人将"C:\ Windows\malicious_code.exe"作为URL传递出去
我目前的想法是做这样的事情:
Uri url = new Uri(urlString, UriKind.Absolute);
if( url.Scheme == Uri.UriSchemeHttp || url.Scheme == Uri.UriSchemeHttps )
{
Process.Start(url.AbsoluteUri);
}
Run Code Online (Sandbox Code Playgroud)
我忘了我的'urlString'可能包含的任何其他东西,这使得这很危险(例如,一个新的行字符,允许有人潜入第二个进程在URL之后启动或可能执行以http开头的相对可执行文件)?
我很确定这两种情况都由此处理(因为我不相信Process.Start允许你像在BATCH文件中那样启动两个进程,这应该只允许以http:或https:开头的字符串.是有效的网址)
在C#中有更好的方法吗?
我有这个SQL更新查询:
UPDATE table1
SET table1.field1 = 1
WHERE table1.id NOT IN (SELECT table2.table1id FROM table2);
Run Code Online (Sandbox Code Playgroud)
应用程序的其他部分可以向table2添加记录,使用字段table1id引用table1.
这里的目标是从table1中删除未被table2引用的记录.
SQL Server是否使用此类查询自动锁定table2,以便在执行此查询时无法将新记录添加到table2?
我也考虑过:
UPDATE table1
SET field1 = 1
WHERE 0 = (SELECT COUNT(*) FROM table2 WHERE table1.id = table2.table1id);
Run Code Online (Sandbox Code Playgroud)
这看起来可能更安全,但速度要慢得多(因为在table1的每一行上都会调用SELECT而不是只为NOT IN调用一行)