小编Kur*_*ler的帖子

将数据从asp.net-mvc传递到javascript的最佳实践

我最近一直在使用ASP.NET MVC和Javascript/jQuery,我似乎正朝着一个方向前进,我总是需要将一些动态值传递给我的javascript.当脚本在页面中时,我做了类似这样的事情:

var isEditable = <%=ViewData["editable"]%>
Run Code Online (Sandbox Code Playgroud)

我喜欢这样快速简单,就像我在HTML中注入一个值一样.但这闻起来.真的,非常糟糕.它打破了Visual Studio的智能感知和代码格式化,使我的脚本难以阅读和理解.

在我看来,另一个解决方案是将我的数据传递给隐藏字段,并使用Javascript引用...

<input type="hidden" id="editable" value="<%=ViewData["editable"]%>" />
var isEditable = $("#editable").attr("value");
Run Code Online (Sandbox Code Playgroud)

这可能会更好,因为它保持脚本完整,并允许我将其移动到外部.js文件.但是这个解决方案的某些东西看起来也不理想.还是只是我?

有人可以推荐将数据传递到脚本的解决方案和最佳实践吗?如果我的脚本最终严重依赖控制器中的viewdata,那么我是走错了路吗?

javascript asp.net-mvc jquery

33
推荐指数
1
解决办法
9892
查看次数

ASP.NET开发人员真的需要关心线程安全吗?

我认为自己了解线程的概念以及为什么某些代码是"线程安全的",但是作为主要使用ASP.NET的人,线程和线程安全是我很少想到的.但是,我似乎在Stack Overflow上遇到了许多评论和答案(不一定是针对ASP.NET)的" 警告 - 这不是线程安全的!,"它往往让我猜测我是否编写了类似的代码,这些代码实际上可能会导致我的应用程序出现问题.[震惊,恐怖等]所以我不得不问:

ASP.NET开发人员真的需要关心线程安全吗?

我的看法:虽然Web应用程序本质上是多线程的,但每个特定请求都在一个线程上,而您创建,修改或销毁的所有非静态类型都是该单个线程/请求所独有的.如果请求创建这将创建一个业务对象实例的DAL对象的实例,我想偷懒初始化此对象中的集合,它并不重要,如果它不是线程安全的,因为它永远不会被感动另一个线程....对?(假设我没有在请求期间启动一个新线程来启动长时间运行的异步进程.我很清楚这会改变一切.)

当然,静态类,方法和变量恰恰相反.每个请求都会共享它们,并且开发人员必须非常小心,不要使用"不安全"的代码,这些代码在由一个用户执行时会对所有其他用户产生意想不到的影响.

但这就是它,因此ASP.NET中的线程安全性大部分归结为:小心你如何设计和使用静态.除此之外,你根本不需要担心它.

我错了吗?你不同意吗?开导我!

asp.net multithreading thread-safety

19
推荐指数
2
解决办法
3131
查看次数

服务层是否可以访问HttpContext?

我正在构建一个大致遵循存储库模式的应用程序,其顶部是服务层,类似于Conery的MVC Storefront的早期版本.

我需要实现一个页面,返回除当前用户之外的所有用户.我已经在存储库和服务层上有GetUsers()方法,因此问题是应用"当前用户除外"的位置.

服务层是否应该知道HttpContext,从而应用此规则?我很想将当前用户(id)从控制器传递给这个服务方法,但是如果服务层能够识别HttpContext并且可以自己完成,那么它似乎更清晰.

一个明显的选择是直接在Controller中应用这个规则,但我对这个想法并不热衷......


编辑 - 只是评论答案:我看到反向依赖问题的问题,我完全忽略了.我将Mehrdad作为回答应有的选票,但每个人都真的提供了值得阅读的有价值的回应!

asp.net-mvc design-patterns

13
推荐指数
2
解决办法
4632
查看次数

当新功能导致现有单元测试失效时该怎么办?

我正在构建一个新的应用程序,并尽可能忠实地坚持"测试优先"的开发.我发现自己处于需要实现/更改具有使许多现有单元测试无效的功能的情况.我该怎么处理这件事?我认为,有3种选择:

  • 更新或删除所有现有测试以满足新功能要求(根据需要添加更多功能),然后实现该功能

  • 首先实现该功能,运行测试以查看故障,并更新或删除任何失败的测试(根据需要添加更多)

  • 为新功能添加新测试,实现功能,运行所有测试以查看旧测试失败,根据需要删除或更新旧测试

第一种选择坚持TDD,但可能会产生极大的反效果.第二种选择是最简单的,但你不会先忠实地测试,也可能没有被"覆盖".第三种选择是对两者的妥协,并且在某种程度上具有吸引力,但是当您刚刚更新旧的时,您可能会重新编写测试.

我不觉得我在这里有任何明确的策略.你在这些情况下做了什么?

tdd unit-testing

11
推荐指数
1
解决办法
272
查看次数

是否可以在FabricJS画布上同时独立拖放多个对象?

我正在开发一款基于触控的应用程序w/Fabric.js.开箱即用,拖放支持非常出色.不幸的是,你一次只能拖动一个对象 - 画布的其余部分基本上是"锁定的",直到当前对象的拖动结束.

是否可以同时拖动多个对象?怎么可能完成?我的用例是这样的:想象一下你可以触摸/拖动多个拼图的画布.我希望能够同时独立触摸和拖动至少2个(每个用不同的手指).

我正在使用标准的拖动事件处理程序.我没有看到任何明显的方法来实现这一目标.

canvas.on('object:moving', function (e) { ... });
Run Code Online (Sandbox Code Playgroud)

html5 canvas fabricjs

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

为什么在刷新浏览器时Application_BeginRequest()会触发两次?

我在Global.asax文件中(在ASP.NET MVC应用程序中)使用Application_BeginRequest事件观察到一些非常令人困惑的行为.当通过调试器运行时,如果我刷新浏览器(IE7),此事件将触发两次.如果我单击链接或以其他方式手动请求页面,它会触发一次 - 如预期的那样.

为什么刷新导致BeginRequest触发两次?

我正在通过一个全新的MVC项目来观察这一点,其中以下内容被加入到Global.asax.cs中

protected void Application_BeginRequest() { 
    //executed twice
}
Run Code Online (Sandbox Code Playgroud)

对于上下文,我试图在此事件期间向HttpContext.Current.Items集合添加一个新对象,因此它将在整个请求过程中持续存在.显然,我不希望这次刷新请求发生两次!

asp.net

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

IIS7 HttpModule和ISAPI Filter执行顺序

我有一个使用ISAPI Rewrite的站点以及一个自定义的HttpModule,它们都进行了Url重定向和重写.

在IIS 6中,一切正常:首先运行ISAPI Rewrite过滤器,然后运行HttpModule.在IIS 7(集成模式)中,顺序现在是相反的,这会产生问题.

我的问题,特别是,HttpModule有一个条件,它会发出一个Url重写使用context.RewritePath.如果没有提供文档,它将显式地向路径添加"index.aspx",因此请求/test/被重写为/test/index.aspx.

在重写路径之后的某个时刻,执行ISAPI重写过滤器.我们有一个与模块相反的规则:/test/index.aspx获取301重定向的请求/test/.因此,我们有一个无限循环.

如何在IIS 7中确定HttpModules和ISAPI过滤器的执行顺序?订单可以更改吗?我发现了这个问题,但它并没有真正帮助.我不是IIS 7的主人,但我确实在某种程度上理解模块和ISAPI过滤器"一起"运行.不幸的是,他们的管理方式不同,我无法弄清楚如何强迫一个人跑到另一个人面前.救命!

注意:我们假设我无法更改现有代码.它在IIS 6中有效.我只想知道是否有办法使其在IIS 7集成模式下工作.

asp.net iis-7 httpmodule isapi

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

ASP.NET MVC:如何使用HttpContext.User

我真的迷失了如何使用HttpContext.User.我到处都读到了FormAutherication的优点,但我不知道它是如何工作的.如果我做这样的事情:

ControllerContext.HttpContext.User = new GenericPrincipal(GetUser(username, password), roles);
Run Code Online (Sandbox Code Playgroud)

ControllerContext.HttpContext.User包含什么?以及如何通过这种方式访问​​用户信息?

我认为我有这样的行动:

public User GetUser(string username, string password)
    {
        try
        {
            var user = (from u in dm.Users
                        join r in dm.Roles
                        on u.Role_ID_FK equals r.RoleID
                        where u.Username.Equals(username) && u.Password.Equals(password)
                        select u).Single();

            return user;
        }
        catch (Exception e)
        {
            return null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后如果我想在我的视图中使用用户信息,比如用户名或角色,我可以在我的视图中调用ControllerContext.HttpContext.User.Username.但这看起来是错误的方式.

那么你们可以给我一个方向,或者发布一个链接到一个可以的网站吗?

asp.net-mvc httpcontext

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

Google 跟踪代码管理器是否将字符串值“false”的变量解释为布尔值 false?

我在跟踪代码管理器中设置了一个新的数据层变量,该变量将表示事件是否是非交互命中。这应该是一个布尔真/假值。我设置了默认值false(不带引号)。

我注意到当我在我的事件中明确包含此变量作为布尔值时,例如:

dataLayer.push({'event': 'gaEvent', ..., 'nonInteractionHit': false});
Run Code Online (Sandbox Code Playgroud)

跟踪代码管理器的预览模式在事件属性中显示Non-Interaction Hit: false布尔值(不带引号)。这是预料之中的。

但是,当我没有指定 nonInteractionHit 的值时,例如:

dataLayer.push({'event': 'gaEvent', ...});
Run Code Online (Sandbox Code Playgroud)

Non-Interaction Hit: 'false'预览模式显示使用as 作为字符串值(带引号)触发的事件。基本上,它似乎将我的默认值解释为字符串而不是布尔值。这很令人担忧,因为 JavaScript 非常棒,而且字符串'false'实际上是true

所以我的问题是:GTM 是否将“false”或“true”的字符串表示视为正确的布尔值,或者只是字符串,特别是在应该是布尔值的属性的上下文中使用时?就我而言,实际上是否根据我的需要'false'进行评估?false

额外加分:有没有办法将变量的默认值指定为正确的布尔值?用户界面似乎不允许这样做——你只是得到一个文本框来输入一个显然被解释为字符串的值。

google-tag-manager

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

持久化到数据库时更新或增加值是否更好?

我有一个应用程序,用户执行操作并获得积分.在应用程序中执行算法并使用结果值更新点数据库字段或让数据库进行数学计算会更好吗?

假设0分的用户将额外收到2个:

//app does the math (0+2) and issues this statement
update users set points = 2 where id = 1
Run Code Online (Sandbox Code Playgroud)

VS

//app only knows to update by 2, db does the math
update users set points = points+2 where id = 1
Run Code Online (Sandbox Code Playgroud)

SQL性能方面有什么不同吗?对于应用程序设计,这种逻辑应该驻留在哪一种方法中,一种方法比另一方法更好吗?

编辑:这个编辑可能来得太晚,无法提供很好的服务,但我只是想回应一些反馈并做出澄清.虽然我对任何db性能差异感到好奇,但这不是一个问题.我关心的是这种逻辑最好的存在,以及为什么人们应该优先于另一种情况以及在哪种情况下.

一方面,我的几乎所有逻辑都存在于应用程序中,因此在那里进行数学计算是一致的,就像Hank的答案一样.但另一方面,有一些潜在的延迟/线程问题可能表明逻辑应由db执行,由BlixtAndrew提出.

.net sql sql-server

3
推荐指数
1
解决办法
152
查看次数

为私人网站测试版添加一层安全性最不显眼的方法是什么?

假设我有一个ASP.NET站点(本例中为MVC),它使用Forms身份验证和典型的成员身份系统.该站点允许经过身份验证的用户和匿名用户.

当我将该网站作为私有测试版发布时,我想在应用程序之上添加另一层安全性,例如超级用户的简单密码系统.一旦用户通过了这一层安全性,我仍然希望我的表单身份验证/成员身份系统到位,因此beta测试人员可以将该站点视为经过身份验证的用户或匿名用户.

实现这一目标最不引人注目的方法是什么?我正在寻找最简单的解决方案,需要最少量的新代码或修改后的代码.例如,我不想修改每个控制器来检查特殊的cookie.肯定有更好的办法...

这里有一个非常相似的问题,但似乎有问题的网站(一旦公开)只会提供匿名请求,所以它不一定与我的情况相比.这个答案表明ServerFault使用了一些cookie系统,但是没有关于它如何实现的进一步细节.

asp.net asp.net-mvc beta-testing

2
推荐指数
1
解决办法
173
查看次数