我一直在尝试在我的项目中创建一个控制器来提供可能会变得非常复杂的报告.因此,他们可能需要相对较长的时间,进度条肯定会帮助用户知道事情正在发展.该报告将通过AJAX请求启动,其想法是定期JSON请求将获取状态并更新进度条.
我一直在试验AsyncController,因为这似乎是一种很好的方式来运行长进程而不占用资源,但它似乎没有给我任何检查进度的方法(并且似乎阻止了进一步的JSON请求和我还没有发现原因).之后,我尝试将控制器中的静态变量存储进度并从中读取状态 - 但说实话,所有这些看起来都有些笨拙!
感谢所有建议!
我刚开始在我的项目中使用AsyncController来处理一些长时间运行的报告.因为我可以启动报告,然后在等待它返回并在屏幕上填充元素时执行一些其他操作,这似乎是理想的.
我的控制器看起来有点像这样.我试图使用一个线程执行长任务,我希望释放控制器以获取更多请求:
public class ReportsController : AsyncController
{
public void LongRunningActionAsync()
{
AsyncManager.OutstandingOperations.Increment();
var newThread = new Thread(LongTask);
newThread.Start();
}
private void LongTask()
{
// Do something that takes a really long time
//.......
AsyncManager.OutstandingOperations.Decrement();
}
public ActionResult LongRunningActionCompleted(string message)
{
// Set some data up on the view or something...
return View();
}
public JsonResult AnotherControllerAction()
{
// Do a quick task...
return Json("...");
}
}
Run Code Online (Sandbox Code Playgroud)
但我发现的是,当我使用jQuery ajax请求调用LongRunningAction时,我之后做的任何进一步的请求都会在它后面备份,直到LongRunningAction完成才会处理.例如,调用LongRunningAction需要10秒,然后调用不到一秒的AnotherControllerAction.AnotherControllerAction只是在返回结果之前等待LongRunningAction完成.
我还检查了jQuery代码,但如果我专门设置"async:true",这仍然会发生:
$.ajax({
async: true,
type: "POST",
url: "/Reports.aspx/LongRunningAction",
dataType: "html",
success: …Run Code Online (Sandbox Code Playgroud) 最近,我一直在使用ContentEditable开发一个简单的编辑器。该应用程序的要求很简单,唯一的例外是能够插入受常规编辑操作保护的文本块。
这些文本块无法编辑,并且必须表现为单个字符,才能在其中移动光标或将其删除。
生成的HTML的示例如下所示:
<div id="editor" contenteditable style="height: 400px; border: 1px solid black; margin: 4px; padding: 4px; overflow:auto;">
"This is standard text with a "
<span class="attrib">
#shadow-root
"PROTECTED"
"_"
</span>
" block"
</div>
Run Code Online (Sandbox Code Playgroud)
尽管这提供了我需要的受保护文本部分,但它有两个主要问题我无法解决:
有没有更好的方法可以做到这一点,还是无法以这种方式使用影子DOM?