小编ric*_*ent的帖子

如何在ASP.NET中将JSON反序列化为简单的Dictionary <string,string>?

我在JSON中有一个简单的键/值列表,通过POST发送回ASP.NET.例:

{ "key1": "value1", "key2": "value2"}
Run Code Online (Sandbox Code Playgroud)

我并没有想要进入强大的.NET对象

我只需要一个普通的旧的Dictionary(Of String,String),或者一些等价的(hash table,Dictionary(Of String,Object),old-school StringDictionary - hell,一个2-D字符串数组对我有用.

我可以使用ASP.NET 3.5中的任何可用内容,以及流行的Json.NET(我已经将其用于序列化客户端).

显然,这些JSON库都没有开箱即用的明显功能 - 它们完全专注于通过强大的合同进行基于反射的反序列化.

有任何想法吗?

限制:

  1. 我不想实现自己的JSON解析器
  2. 无法使用ASP.NET 4.0
  3. 宁愿远离旧的,已弃用的JSON ASP.NET类

json asp.net-ajax asp.net-3.5 json.net

642
推荐指数
12
解决办法
58万
查看次数

如何过滤除特定白名单之外的所有HTML标记?

这适用于.NET.IgnoreCase已设置且未设置MultiLine.

通常我在正则表达式上都很不错,也许我的咖啡因含量很低......

允许用户输入HTML编码的实体(<lt;,<amp;等),并使用以下HTML标记:

u, i, b, h3, h4, br, a, img
Run Code Online (Sandbox Code Playgroud)

允许自动关闭和<img />,有或没有额外空间,但不是必需的.

我想要:

  1. 除去上面列出的所有开始和结束HTML标记之外.
  2. 从剩余标签中删除属性,锚点可以有href.

到目前为止,我的搜索模式(替换为空字符串):

<(?!i|b|h3|h4|a|img|/i|/b|/h3|/h4|/a|/img)[^>]+>
Run Code Online (Sandbox Code Playgroud)

似乎剥离了我想要的所有开始和结束标签,但有三个问题:

  1. 必须包含每个允许标记的结束标记版本是丑陋的.
  2. 属性存活下来.这可以在一次更换中发生吗?
  3. 标签开始允许的标签名漏网之鱼.例如,"<abbrev>"和"<iframe>".

以下建议的模式不会删除没有属性的标记.

</?(?!i|b|h3|h4|a|img)\b[^>]*>
Run Code Online (Sandbox Code Playgroud)

如下所述,">"在属性值中是合法的,但可以肯定地说我不会支持它.此外,不会担心CDATA块等.只是一点点HTML.

到目前为止,漏洞的答案是最好的,谢谢!这是他的模式(希望PRE对我更好):

static string SanitizeHtml(string html)
{
    string acceptable = "script|link|title";
    string stringPattern = @"</?(?(?=" + acceptable + @")notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:([""']?).*?\1?)?)*\s*/?>";
    return Regex.Replace(html, stringPattern, "sausage");
}
Run Code Online (Sandbox Code Playgroud)

我认为仍然可以对这个答案进行一些小的调整:

  1. 我认为可以通过在"可接受的"变量中添加"! - "并对表达式的末尾进行小的更改以允许可选的尾随来修改以捕获简单的HTML注释(那些本身不包含标记的注释) "\ S--".

  2. 我认为如果属性之间存在多个空白字符,这将会中断(例如:带有换行符的重格式HTML和属性之间的选项卡).

编辑2009-07-23:这是我使用的最终解决方案(在VB.NET中):

 Dim AcceptableTags As String = "i|b|u|sup|sub|ol|ul|li|br|h2|h3|h4|h5|span|div|p|a|img|blockquote"
 Dim WhiteListPattern As String = "</?(?(?=" & AcceptableTags & _
      ")notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:([""']?).*?\1?)?)*\s*/?>" …
Run Code Online (Sandbox Code Playgroud)

html c# regex vb.net

35
推荐指数
2
解决办法
3万
查看次数

Ext JS中的自动换行网格单元格

(这不是一个问题本身,我正在记录我使用Ext JS 3.1.0找到的解决方案.但是,如果你知道更好的解决方案,请随时回答!)

Ext JS Grid对象的Column配置没有允许自动换行文本的本机方式,但是有一个css属性可以覆盖TD网格创建的元素的内联CSS .

不幸的是,TD元素包含一个DIV包裹内容元素,并DIV设置为white-space:nowrap通过的Ext JS的样式,所以重写TDCSS没有好处.

我将以下内容添加到我的主CSS文件中,这是一个简单的修复程序,似乎不会破坏任何网格功能,但允许white-space我应用于TD的任何设置都传递给DIV.

.x-grid3-cell {
    /* TD is defaulted to word-wrap. Turn it off so
       it can be turned on for specific columns. */
    white-space:nowrap;
    }

.x-grid3-cell-inner {
    /* Inherit DIV's white-space from TD parent, since
       DIV's inline style is not accessible in the column
       definition. */
    white-space:inherit;
    }
Run Code Online (Sandbox Code Playgroud)

YMMV,但它对我有用,想要把它作为一个解决方案,因为我找不到通过搜索Interwebs的工作解决方案.

grid extjs word-wrap

29
推荐指数
3
解决办法
4万
查看次数

无论ORDER BY如何,SELECT TOP都很慢

我在SQL Server中运行一个相当复杂的查询,运行视图,格式如下:

SELECT *
   FROM myview, foo, bar 
   WHERE shared=1 AND [joins and other stuff]
   ORDER BY sortcode;
Run Code Online (Sandbox Code Playgroud)

如上所示的查询计划显示了Sort在决赛之前的操作SELECT,这正是我所期望的.只有35个匹配的记录,查询在2秒内完成.

但是,如果我添加TOP 30,查询需要将近3分钟!使用SET ROWCOUNT同样慢.

查看查询计划,它现在似乎在连接和过滤器myview 之前对所有200多万条记录进行排序.

这个"排序"在查询计划中显示为索引上的sortcode索引扫描,主表上的聚簇索引查找以及它们之间的嵌套循环,所有这些都在连接和过滤器之前.

如何SORT 在之前 强制SQL Server TOP,就像TOP未指定时一样?

我不认为构造myview是问题,但为了以防万一,它是这样的:

CREATE VIEW myview AS
   SELECT columns..., sortcode, 0 as shared FROM mytable
   UNION ALL
   SELECT columns..., sortcode, 1 as shared FROM [anotherdb].dbo.mytable
Run Code Online (Sandbox Code Playgroud)

本地mytable有几千条记录,而mytable在同一MSSQL实例的另一个数据库中有几百条记录.两个表在各自的sortcode列上 …

t-sql sql-server sql-server-2005 query-hints sql-execution-plan

22
推荐指数
1
解决办法
1万
查看次数

如何在Excel宏中使用JavaScript?

这里有一个由Google托管的非常酷的差异类:

http://code.google.com/p/google-diff-match-patch/

我之前在一些网站上使用过它,但现在我需要 Excel宏中使用它来比较两个单元格之间的文本.

但是,它仅适用于JavaScript,Python,Java和C++,而不适用于VBA.

我的用户仅限于Excel 2003,因此纯.NET解决方案无效.手动将代码翻译为VBA将花费太多时间并且难以升级.

我考虑的一个选项是使用.NET编译器(JScript.NET或J#)编译JavaScript或Java源代码,使用Reflector输出为VB.NET,然后最终手动将VB.NET代码降级为VBA,给我一个纯粹的VBA解决方案.在使用任何.NET编译器进行编译时遇到问题之后,我放弃了这条路径.

假设我可以使用一个可用的.NET库,我本可以使用ExcelDna(http://www.codeplex.com/exceldna)这个开源Excel插件来简化.NET代码集成.

我的最后一个想法是托管一个Internet Explorer对象,向它发送JavaScript源代码并调用它.即使我让它工作,我的猜测是它会变得很脏而且很混乱.

更新:找到解决方案!

我通过接受的答案使用了下面描述的WSC方法.我不得不稍微更改WSC代码以清理差异并返回一个VBA兼容的数组数组:

function DiffFast(text1, text2)
{
    var d = dmp.diff_main(text1, text2, true);
    dmp.diff_cleanupSemantic(d);
    var dictionary = new ActiveXObject("Scripting.Dictionary"); // VBA-compatible array
    for ( var i = 0; i < d.length; i++ ) {
    dictionary.add(i, JS2VBArray(d[i]));
    }
    return dictionary.Items();
}

function JS2VBArray(objJSArray)
{
    var dictionary = new ActiveXObject("Scripting.Dictionary");
    for (var i = 0; i < objJSArray.length; i++) {
        dictionary.add( i, objJSArray[ i ] );
        }
    return dictionary.Items(); …
Run Code Online (Sandbox Code Playgroud)

.net javascript j# excel vba

19
推荐指数
1
解决办法
4万
查看次数

如何覆盖Ext JS JsonStore超时?

我有一个JsonStore需要从一个超过30秒的HTTP请求返回.

在JsonStore配置上设置"timeout"属性不会覆盖30秒超时,也不会设置代理(而不是仅设置url属性)并在代理上设置超时.

如何延长此超时?

(我正在使用Ext JS 3.1.1)

var ds = new Ext.data.JsonStore({
    autoSave:       true,
    method:         "POST",
    /*url:          "search-ajax.aspx",
    timeout:        120000,*/
    root:           "rows",
    totalProperty:  "results",
    idProperty:     "primarykeyvalue",
    proxy:      new Ext.data.HttpProxy({ url: "search-ajax.aspx", timeout: 120000 }),
    fields:     previewColumnConfig,
    baseParams: {
        Command:    "",
        ID:     primaryKeyValue,
        Entity: entityFullName,
        vetype: ValidationEntityType,
        vepk:       ValidationEntityPK,
        now:        (new Date()).getTime()
        },
    writer: new Ext.data.JsonWriter({
        encode:     true,
        listful:    false
        })
    });
Run Code Online (Sandbox Code Playgroud)

json extjs

16
推荐指数
2
解决办法
3万
查看次数

Excel加载项如何响应任何工作表中的事件?

我们的工作簿是服务器生成的SpreadsheetML,它不能包含任何 VBA代码.不幸的是,创建本机Excel文件或Excel 2007 XML文件也不是一种选择.

因此,我有一个Excel加载项(VBA,而不是XLL),我们的每个用户都会安装这些加载项以添加我们的工作簿所需的一些额外的UDF等.

这很好用,但是现在我需要有一个宏,每次用户更改任何单元格中的文本时需要执行,无论他们当时正在使用什么工作簿.

到目前为止,我已在我的加载项中创建了一个新的类模块(SheetChangeHandler),其代码如下:

Option Explicit
Private WithEvents App As Application

Private Sub Class_Initialize()
    Set App = Application
End Sub

Private Sub App_SheetChange(ByVal Sh As Object, ByVal Source As Range)
    Debug.Print "Changed"
    On Error GoTo Finish
    App.EnableEvents = False
    DoWorkOnChangedStuff Sh, Source
Finish:
    App.EnableEvents = True
End Sub
Run Code Online (Sandbox Code Playgroud)

在我的加载项中,我添加了一行来实例化新类:

Public MySheetHandler As New SheetChangeHandler
Run Code Online (Sandbox Code Playgroud)

我的理解是,这应该使Excel 为所有打开的工作簿发送Add-In 所有 SheetChange事件,而不需要包含任何宏代码的工作簿.

但它没有工作......没有调试行,当我更改任何工作表上的单元格时,我的DoWorkOnChangedStuff代码没有被调用.

有任何想法吗?

excel events vba add-in excel-vba

8
推荐指数
1
解决办法
1万
查看次数

SQL Query执行快捷方式OR逻辑?

我有三张桌子:

SmallTable
   (id int, flag1 bit, flag2 bit)
JoinTable
   (SmallTableID int, BigTableID int)
BigTable
   (id int, text1 nvarchar(100), otherstuff...)
Run Code Online (Sandbox Code Playgroud)

SmallTable最多只有几十条记录.BigTable有几百万,实际上是一个视图,UNIONS在这个数据库中的一个表与同一服务器上的另一个数据库中的表.

这是连接逻辑:

SELECT * FROM
    SmallTable s
    INNER JOIN JoinTable j ON j.SmallTableID = s.ID
    INNER JOIN BigTable b ON b.ID = j.BigTableID
WHERE
    (s.flag1=1 OR b.text1 NOT LIKE 'pattern1%')
    AND (s.flag2=1 OR b.text1 <> 'value1')
Run Code Online (Sandbox Code Playgroud)

平均连接大小是几千个结果.显示的所有内容都已编入索引.

对于大多数SmallTable记录,flag1flag2设置为1,所以实际上甚至不需要访问BigTable.text1上的索引,但SQL Server无论如何都会这样做,导致代价高昂的索引扫描和嵌套循环.

有没有更好的方式来暗示到SQL Server,如果flag1flag2都被设置为1,它不应该甚至懒得看text1

实际上,如果我可以在这些情况下完全避免加入BigTable(管理JoinTable,这不会产生问题),这将使这个关键查询更快.

t-sql sql-server performance short-circuiting sql-execution-plan

7
推荐指数
1
解决办法
2987
查看次数

如何在Gulp中获得简单的Vue编译?

我已经在我的工作流程中使用了gulp,我目前没有使用webpack或browserify,但似乎编译Vue 2.x组件需要一个或另一个,没有主动维护的机制来直接编译Vue组件作为gulp任务.

我已经搜索过,似乎无法找到一个工作参考,只需将*.vue组件中的目录编译成单个JavaScript文件,然后我可以从我的页面链接.我只是想创建和使用一些组件,我不是在创建SPA.

这就是我所拥有的:

gulpfile.js

const scriptDestFolder = "\\foo\\";
const browserify = require('browserify');
const source = require('vinyl-source-stream');
const gulp = require("gulp");
const vueify = require('vueify');

gulp.task('vue', function () {
    return browserify({ 
                entries: ['./vuecomponents.js'],
                transform: [vueify]
        })
        .bundle()
        .pipe(source('vue-bundle.js'))
        .pipe(gulp.dest(scriptDestFolder));
});
Run Code Online (Sandbox Code Playgroud)

vuecomponents.js

var Vue = require('vue');
var App = require('./vue/app.vue');
Run Code Online (Sandbox Code Playgroud)

app.vue文件与此处的示例相同.我无意实际拥有一个"app"组件,我只想尝试一个示例,我会用一个单文件组件列表替换它.

这是结果:

Error: Parsing file \\blah\vue\app.vue:
'import' and 'export' may only appear at the top level (14:0)
Run Code Online (Sandbox Code Playgroud)

我很难过.我认为 browserify试图在编译之前解析原始的vue代码,但同样,我在browserify上是一个完整的新手.

browserify gulp vue.js vuejs2 vueify

7
推荐指数
1
解决办法
1608
查看次数

当用户的浏览器断开连接时,如何在ASP.NET中取消数据库查询?

我的ASP.NET(3.5)应用程序允许用户运行一些复杂的查询,最多可能需要4分钟才能返回结果.

当我正在进行长循环代码时,我会Response.IsClientConnected()偶尔检查,以便在用户关闭浏览器或点击停止按钮时我可以结束页面.

但是在查询SQL Server时,我的.NET代码在调用时被阻止GetDataReader().

是否有一种直接的方式来异步地执行GetDataReader()所以我可以等待它,但仍然检查,比如每5-10秒查看用户是否仍然连接,如果他们已经离开,就保释数据库查询?

还是有其他一些我没想到的选择?

sql-server asp.net asynchronous

6
推荐指数
1
解决办法
1332
查看次数