我正在编写一个脚本,旨在嵌入第三方网站以向其添加功能.我最近撕掉了我相当混乱的自定义加载程序代码并开始用requirejs替换它.其中一个可选地为我加载的库(取决于传入的一些参数)是jQuery.
这很好用,直到我的脚本包含在jQuery已经打开的页面上,在这种情况下,似乎发生的是一些插件中途加载,requirejs在页面版本上加载jQuery,插件立即中断.
要求客户重写他们的页面只是为了使用这个脚本是不可能的,所以我想做的是检测jQuery是否已经加载,如果是,跳过通过requirejs加载它,并只使用已经加载的(当他们使用更旧版本的jQuery时,这可能会让我遇到奇怪的边缘情况和错误,但我没有太多选择).
我想我会做的是编写一个新模块,首先看看是否加载了jQuery,如果是,只需导出jQuery对象,如果不是,则加载它,然后进行导出.但是,我似乎受到了阻碍,因为模块的定义函数似乎需要同步工作,所以我不能去加载另一个脚本,这将是异步的,然后将导出填充到requirejs中.
我在文档中遗漏了什么吗?我正在尝试不可能吗?
所以,我一直在用头撞墙,我找不到任何好的消息来源.也许我忘记了模型绑定的东西在MVC3中是如何工作的,但这就是我想要做的事情:我有一些与Knockout绑定的编辑器来处理模型的编辑.模型没什么了不起的:
public class SetupTemplate
{
public int Id { get; set; }
public string Name { get; set; }
public string Template { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我试图呼叫的动作的签名是:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateTemplate(SetupTemplate template)
Run Code Online (Sandbox Code Playgroud)
从这里的另一个问题,我拿起这个相当有用的片段来获取防伪标记:
window.addAntiForgeryToken = function(data) {
data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
return data;
};
Run Code Online (Sandbox Code Playgroud)
所有这些都与我一起尝试通过ajax发布更新:
payload = window.addAntiForgeryToken(ko.mapping.toJS(self.data));
$.ajax({
type: "post",
url: endpoint,
data: payload,
success: function(data) {
//Handle success
}});
Run Code Online (Sandbox Code Playgroud)
这导致了Chrome开发人员工具的表单数据部分
Id:1
Name:Greeting
Template: [Template Text]
__RequestVerificationToken: [The really long anti-forgery token]
Run Code Online (Sandbox Code Playgroud)
拾取防伪标记,但我的模型为空.我见过的大多数例子只使用传递的单个参数,而不是模型.
我确定我错过了一些明显的东西,对它可能是什么的任何见解?
编辑:响应@Mark,将调用更改为:
$.ajax({
type: …Run Code Online (Sandbox Code Playgroud) 我遇到了knockout.js的问题,并且映射插件没有为源数据中的子数组创建模型
var data = {
outer: [
{
'id': 1,
name: 'test outer',
inner: [{
'id': 1,
name: 'test inner'}]}]
};
function OuterModel(data) {
var self = this;
ko.mapping.fromJS(data, {}, this);
self.fullText = ko.computed(function() {
return self.id() + ". " + self.name();
});
}
function InnerModel(data, parent) {
var self = this;
ko.mapping.fromJS(data, {}, this);
self.fullText = ko.computed(function() {
return self.id() + ". " + self.name() + "(" + parent + ")";
});
}
function PageModel() {
var self = …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过OpenXML SDK中的docx读取作为模板在.Net Web应用程序中用于表单字母(基本上).我有一个带有我想要的格式的docx,用xsd定义的XML Schema标记标记(无论它们被称为什么,帮助对此都非常无用).
我在Google上发现的唯一类似的东西似乎是用带有所需数据的文本元素替换CustomXmlBlock元素.这似乎......凌乱而脆弱.
我还有一个额外的复杂性,一些数据是分层的,包含部分的元素,然后是该部分中的项目.这似乎完全打破了上述方法.
那么,有人可以指出我这样做的正确方向,或建议一个更好的方法来处理模板形式的字母?
我正在尝试从NuGet安装Microsoft.AspNet.SignalR并得到以下错误:
'Microsoft.Owin.Security 2.0.2'。您正在尝试将此软件包安装到以'.NETFramework,Version = v4.0'为目标的项目中,但是该软件包不包含任何与该框架兼容的程序集引用或内容文件。有关更多信息,请联系软件包作者。
有没有人遇到过这种情况,并且知道解决方案是什么?
在我正在开发的应用程序中,我使用 Mediatr 及其管道来处理数据库交互、一些次要业务逻辑、验证等。
我可以在管道中处理一些诸如访问控制之类的检查,因为我使用此处描述的上下文对象https://jimmybogard.com/sharing-context-in-mediatr-pipelines/从 ASP 进行。具有用户信息和声明的自定义上下文对象的网络身份。
我遇到的一个问题是,由于这个应用程序是多租户的,我需要确保即使存在一个对象,它也属于该租户,而确保这一点的唯一方法是从数据库中获取该对象并检查它。在我看来,验证不应该有副作用,所以我不想依赖它来填充上下文对象。但是,当 Mediatr 处理程序检查对象是否存在等时,这会将大量验证推送到 Mediatr 处理程序中,从而导致大量重复代码。我真的不想多次查询数据库,因为某些查询可能会很昂贵。
在实际请求处理程序中进行更复杂的验证的另一个问题是获取本质上验证错误的内容。目前,如果其中一项检查失败,我会抛出一个ValidationException,然后由中间件捕获并转换为ProblemDetails返回给 API 调用者的 a 。这基本上是流量控制的例外情况,无论如何,验证失败实际上并不是“例外”。
我对如何解决这个问题的想法是:
在管道中的某个位置,当我构建上下文时,包括尝试从数据库中获取所需的对象。如果其中任何一个为空,验证就会失败。这似乎会使测试变得更加困难,并且需要以某种方式装饰请求(或使用反射),以便管道可以知道尝试加载这些对象。
在验证器中进行查询,但使用某种缓存感知存储库,因此当稍后查询同一对象时,它是从缓存而不是数据库提供的。处理程序还将使用此缓存感知存储库(当前处理程序直接与 EF Core DbContext 交互以进行查询)。这就增加了缓存失效的问题,无论如何,我必须在某个时候处理这个问题(相当多的项目很少被修改)。为了进行测试,可以注入一个实际上不缓存任何内容的虚拟缓存对象。
使来自请求的所有响应实现一个接口(或扩展一个抽象类),该接口具有验证信息、一般成功标志等。这可以直接通过 API 返回,也可以使用一些管道将失败转换为ProblemDetails. 这将为每个响应和处理程序添加一些样板,但避免了流量控制的异常以及其他选项中的缓存/反射问题。
假设对于 1 和 2,任何类型的竞争条件都不是问题。对象不会更改所有者,并且很少出于审计/会计目的而实际从数据库中删除内容。
我知道没有真正适合所有此类问题的方法,但我想知道我是否缺少其他选项,或者拥有类似管道的任何人在使用列出的其中之一时遇到的任何长期可维护性问题选项。
asp.net ×2
jquery ×2
ajax ×1
asp.net-core ×1
c#-4.0 ×1
csrf ×1
json ×1
knockout.js ×1
mediatr ×1
nuget ×1
openxml ×1
openxml-sdk ×1
requirejs ×1
wordml ×1