- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近使用 Nuget 安装了 T4MVC。在此之前我有一个旧版本可以正常工作,但是我有一个需要异步 Controller 的新要求。创建异步 Controller 后,由于与 t4 相关,我的项目无法编译。所以我使用 Nuget 进行了更新。
我现在遇到的问题是我的 Controller 工作正常,直到我最近刷新了 t4mvc。刷新我的代码编译后,但是当我调用异步操作时,它会在很长时间后返回并返回大量不正确的数据。此外,更重要的是,如果我在 Controller 中设置断点,它就不再命中它们了?!如果我将我的 DocumentController.generated.cs 恢复到最后一个工作版本,一切正常。
下面是我的旧 DocumentController.generated.cs 有效,而新的无效。
谁能帮我弄清楚这里发生了什么?我已经变得依赖 T4MVC,因为它太好了,但是我真的无法避免这些异步操作。
老的
// <auto-generated />
// This file was generated by a T4 template.
// Don't change it directly as your change would get overwritten. Instead, make changes
// to the .tt file (i.e. the T4 template) and save it to regenerate this file.
// Make sure the compiler doesn't complain about missing Xml comments
#pragma warning disable 1591
#region T4MVC
using System;
using System.Diagnostics;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Web;
using System.Web.Hosting;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing;
using T4MVC;
namespace WebUI.Client.Controllers {
public partial class DocumentController {
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public DocumentController() { }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
protected DocumentController(Dummy d) { }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
protected RedirectToRouteResult RedirectToAction(ActionResult result) {
var callInfo = result.GetT4MVCResult();
return RedirectToRoute(callInfo.RouteValueDictionary);
}
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public DocumentController Actions { get { return MVC.Document; } }
[GeneratedCode("T4MVC", "2.0")]
public readonly string Area = "";
[GeneratedCode("T4MVC", "2.0")]
public readonly string Name = "Document";
static readonly ActionNamesClass s_actions = new ActionNamesClass();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionNamesClass ActionNames { get { return s_actions; } }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionNamesClass {
public readonly string Index = "Index";
}
static readonly ViewNames s_views = new ViewNames();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ViewNames Views { get { return s_views; } }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ViewNames {
public readonly string Index = "~/Views/Document/Index.aspx";
}
}
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class T4MVC_DocumentController: WebUI.Client.Controllers.DocumentController
{
public T4MVC_DocumentController() : base(Dummy.Instance) { }
public override System.Web.Mvc.ActionResult Index() {
var callInfo = new T4MVC_ActionResult(Area, Name, ActionNames.Index);
return callInfo;
}
}
}
#endregion T4MVC
#pragma warning restore 1591
// <auto-generated />
// This file was generated by a T4 template.
// Don't change it directly as your change would get overwritten. Instead, make changes
// to the .tt file (i.e. the T4 template) and save it to regenerate this file.
// Make sure the compiler doesn't complain about missing Xml comments
#pragma warning disable 1591
#region T4MVC
using System;
using System.Diagnostics;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Web;
using System.Web.Hosting;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing;
using T4MVC;
namespace WebUI.Client.Controllers {
public partial class DocumentController {
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public DocumentController() { }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
protected DocumentController(Dummy d) { }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
protected RedirectToRouteResult RedirectToAction(ActionResult result) {
var callInfo = result.GetT4MVCResult();
return RedirectToRoute(callInfo.RouteValueDictionary);
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public System.Web.Mvc.JsonResult GetDocumentListCompleted() {
return new T4MVC_JsonResult(Area, Name, ActionNames.GetDocumentListCompleted);
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public System.Web.Mvc.ActionResult GetDocumentThumbnailCompleted() {
return new T4MVC_ActionResult(Area, Name, ActionNames.GetDocumentThumbnailCompleted);
}
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public DocumentController Actions { get { return MVC.Document; } }
[GeneratedCode("T4MVC", "2.0")]
public readonly string Area = "";
[GeneratedCode("T4MVC", "2.0")]
public readonly string Name = "Document";
static readonly ActionNamesClass s_actions = new ActionNamesClass();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionNamesClass ActionNames { get { return s_actions; } }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionNamesClass {
public readonly string Index = "Index";
public readonly string GetDocumentListCompleted = "GetDocumentListCompleted";
public readonly string GetDocumentThumbnailCompleted = "GetDocumentThumbnailCompleted";
}
static readonly ViewNames s_views = new ViewNames();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ViewNames Views { get { return s_views; } }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ViewNames {
public readonly string Index = "~/Views/Document/Index.aspx";
}
}
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class T4MVC_DocumentController: WebUI.Client.Controllers.DocumentController {
public T4MVC_DocumentController() : base(Dummy.Instance) { }
public override System.Web.Mvc.ActionResult Index() {
var callInfo = new T4MVC_ActionResult(Area, Name, ActionNames.Index);
return callInfo;
}
public override System.Web.Mvc.JsonResult GetDocumentListCompleted(Web.Gateway.DocumentMetaDataCollection clientDocuments) {
var callInfo = new T4MVC_JsonResult(Area, Name, ActionNames.GetDocumentListCompleted);
callInfo.RouteValueDictionary.Add("clientDocuments", clientDocuments);
return callInfo;
}
public override System.Web.Mvc.ActionResult GetDocumentThumbnailCompleted(System.IO.Stream document, string type) {
var callInfo = new T4MVC_ActionResult(Area, Name, ActionNames.GetDocumentThumbnailCompleted);
callInfo.RouteValueDictionary.Add("document", document);
callInfo.RouteValueDictionary.Add("type", type);
return callInfo;
}
}
}
#endregion T4MVC
#pragma warning restore 1591
namespace WebUI.Client.Controllers
{
[Activated]
[ConcurrentSessionDisabled]
public partial class DocumentController : AsyncController
{
public readonly HashSet<string> ImageTypes = new HashSet<string>(new[] { "jpeg", "jpg", "png", "tif", "tiff", "bmp" });
public readonly HashSet<string> IgnoredImageTypes = new HashSet<string>(new[] { "tif", "tiff" });
public virtual ActionResult Index()
{
return RedirectToAction("List");
}
public virtual ActionResult List()
{
return View();
}
public virtual ActionResult Thumbnails(int id)
{
ViewData["documentId"] = id;
return View();
}
public void GetDocumentListAsync()
{
AsyncManager.Timeout = 30000;
AsyncManager.OutstandingOperations.Increment();
Task.Factory.StartNew((state) => {
Tuple<int, int> clientDetails = (Tuple<int, int>)state;
DocumentMetaDataCollection clientDocuments = DocumentHelper.GetClientDocuments(clientDetails.Item1, clientDetails.Item2);
AsyncManager.Parameters["clientDocuments"] = clientDocuments;
AsyncManager.OutstandingOperations.Decrement();
}, new Tuple<int, int>(Profile.User().ClientId, Profile.User().CrmAccountId));
}
public virtual JsonResult GetDocumentListCompleted(DocumentMetaDataCollection clientDocuments)
{
return Json(from document in clientDocuments.Documents
select new
{
Id = document.Id,
Values = document.Values,
}, JsonRequestBehavior.AllowGet);
}
public void GetDocumentFilenamesAsync(int id)
{
AsyncManager.Timeout = 5000;
AsyncManager.OutstandingOperations.Increment();
Task.Factory.StartNew((state) =>
{
int documentId = (int)state;
List<string> urls = DocumentHelper.GetUrlsForDocument(documentId);
AsyncManager.Parameters["documentId"] = documentId;
AsyncManager.Parameters["urls"] = urls;
AsyncManager.OutstandingOperations.Decrement();
}, id);
}
public JsonResult GetDocumentFilenamesCompleted(int documentId, List<string> urls)
{
IDictionary<int, string> filenameToUrl = new Dictionary<int, string>();
Regex illegalCharacters = new Regex("[^A-Za-z0-9_[-]:]");
int idCounter = 0;
foreach(string url in urls)
{
filenameToUrl.Add(++idCounter, url);
}
session_HoldDocumentUrls(documentId, filenameToUrl);
return Json(from file in filenameToUrl select new {
Name = filenameFrom(file.Value),
Id = file.Key
});
}
private string filenameFrom(string url)
{
return url.Substring(url.LastIndexOf('/') + 1, url.Length - (url.LastIndexOf('/') + 1));
}
public void GetThumbnailAsync(int documentId, int imageId)
{
AsyncManager.Timeout = 5000;
AsyncManager.OutstandingOperations.Increment();
string url = session_GetDocumentUrls(documentId).First(f => f.Key == imageId).Value;
Task.Factory.StartNew((state) => {
string fileUrl = (string)state;
thumbnailLoader(fileUrl);
}, url);
}
private void thumbnailLoader(string fileUrl)
{
Stream document = DocumentHelper.GetDocument(fileUrl);
string type = fileUrl.Substring(fileUrl.LastIndexOf('.') + 1, fileUrl.Length - (fileUrl.LastIndexOf('.') + 1)).ToLower();
if (ImageTypes.Contains(type))
{
document = ImageHelper.ResizeImage(document, 210);
type = "png";
}
AsyncManager.Parameters["document"] = document;
AsyncManager.Parameters["type"] = type;
AsyncManager.OutstandingOperations.Decrement();
}
public virtual ActionResult GetThumbnailCompleted(Stream document, string type)
{
switch (type)
{
case "png":
return new FileStreamResult(document, "image/png");
case "pdf":
return File(Links.Content.Images.pdf_256_png, "image/png");
default:
return File(Links.Content.Images.document_256_png, "image/png");
}
}
public void FileAsync(int documentId, int imageId)
{
if (session_GetDocumentUrls(documentId) == null)
{
return;
}
string url = session_GetDocumentUrls(documentId).First(f => f.Key == imageId).Value;
AsyncManager.Timeout = 5000;
AsyncManager.OutstandingOperations.Increment();
Task.Factory.StartNew((state) =>
{
string fileUrl = (string)state;
Stream document = DocumentHelper.GetDocument(fileUrl);
string type = fileUrl.Substring(fileUrl.LastIndexOf('.') + 1, fileUrl.Length - (fileUrl.LastIndexOf('.') + 1)).ToLower();
if (ImageTypes.Contains(type) && !IgnoredImageTypes.Contains(type))
{
document = ImageHelper.ConvertToPng(document);
type = "png";
}
AsyncManager.Parameters["document"] = document;
AsyncManager.Parameters["type"] = type;
AsyncManager.OutstandingOperations.Decrement();
}, url);
}
public virtual ActionResult FileCompleted(Stream document, string type)
{
if (document == null || type == null)
{
return RedirectToAction("List");
}
return new FileStreamResult(document, MimeHelper.Lookup("." + type));
}
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public System.Web.Mvc.JsonResult GetDocumentListCompleted() {
return new T4MVC_JsonResult(Area, Name, ActionNames.GetDocumentListCompleted);
}
最佳答案
更新 (4/12/2011):好的,我刚刚发布了一个新版本的 T4MVC (2.6.51),它忽略了异步完成方法。这应该可以为您解决问题!
T4MVC 不支持异步操作。也就是说,你当然可以在你的 Controller 中有异步操作,但你不能使用 T4MVC 引用它们
请参阅有关该主题的上一个问题:
AsyncController in MVC2 and T4MVC: can they work together?
关于.net - T4MVC 异步 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5419173/
Yii::$app->runAction('new_controller/new_action', $params); 我相信这可以用来从另一个 Controller 调用 Controller Ac
这个问题类似于 this ,但我需要访问父成员(不是控制)。我不知道是否可以不使用依赖注入(inject)。 例如,我有一个父级,有一个成员调用用户,我需要从子 Controller 访问用户。 最佳
我有包含 2 个布局的根布局:- 选项面板- 绘制区域 我正在尝试的是访问 OptionsPaneController 中的 DrawAreaController 以调用其绘制方法。下面是 Optio
我的应用程序的 View Controller 层次结构设置如下: UIViewController | UITabBarController | UINavigationCo
我的应用程序的 View Controller 层次结构设置如下: UITabBarController | UINavigationController | | |
当我第一次为我目前在 Storyboard 中开发的应用程序创建基础布局时,我分两步完成: 选择我的 View Controller 并使用 Editor->Embed In->Navigation
设计要求: 显示用户可以选择的项目列表 选择一个项目后,使用后退按钮将用户带到一个新 View 。新 View 应在底部包含第一个屏幕中不存在的选项卡列表 单击选项卡中的项目时,应出现一个带有后退按钮
将父 Controller 设置为“parentCtrl as vm”,并将子 Controller 设置为“childCtrl as vmc”,以避免名称冲突,并且效果良好。 如何在子 Contro
我已经阅读了一些答案,例如关闭当前的 ViewController,但我的情况有所不同,因为我正在展示另一个 ViewController。 虽然我无法访问它的属性,但此代码显示了带有导航 Contr
如我所见,如果我们要实例化一个Model(例如,名为Post),我们只需调用: $post = new Post(); 现在,我还想实例化一个Controller(例如,名为Post,并为此 Cont
我已经疯狂地在整个网络上搜索解决我的问题的方法,但目前还没有。我的问题是我必须检查是否在 HTTP 请求中获得特定文本,该请求在一个 while 循环中,如果我这样做了,那么我应该离开循环并继续线程,
我想用this.get('controllers.pack.query');要得到App.PackQueryController在 App.PackController ,但失败了。 我认为问题是 E
我刚开始使用 Laravel。当我使用 codeigniter 或 zend 框架时,我可以将我的 Controller 组织到一个单独的目录中。例如,我可以创建“user/permission.ph
在 emberjs 前 2 我们可以从另一个 Controller 访问 Controller 或 Controller 中的任何方法 以下方式: App.get('router').get('nav
这可能是非常简单的实现,但我是 iOS 编程的新手,我似乎被卡住了。 所以,基本上,我有一个选项卡式应用程序。我决定除了标签栏之外还需要一个导航栏。为此,我放置了标签栏 Controller ,然后添
我有这个列表 Controller , define([ 'jquery', 'app' ], function ($,app) { app.controller("ListC
我有 3 个 Controller :RootController、FirstController 和 SecondController。我想从 RootController -> FirstCont
我有以下 Controller : /controllers/api/base_controller.rb /controllers/api/v1/articles_controller.rb 当为文
我是 Angular JS 的新手,尝试在另一个 Controller 中调用一个 Controller ,但出现以下错误。 ionic.bundle.js:21157 TypeError: $con
我有一个标签栏 Controller 和它的 3 个 child ,我还有另一个 View ,我制作了一个从 child 到 View Controller 的自定义转场,还有一个从 View Con
我是一名优秀的程序员,十分优秀!