嗨,我正在学习Ajax + MVC.我认为控制器自动处理ajax感知的Redirect()会很好.经过一番挖掘,我找到了这个链接的代码.下面的代码对用户完全透明,用户只需调用Redirect(someUrlString),无需担心普通/ ajax调用之间的区别.使它非常整洁和凉爽.
public abstract class BaseController : System.Web.Mvc.Controller {
//turn into ajax aware redirect
protected override RedirectResult Redirect(string url) {
return new AjaxAwareRedirectResult(url);
}
}
Run Code Online (Sandbox Code Playgroud)
和......
public class AjaxAwareRedirectResult : RedirectResult {
public AjaxAwareRedirectResult(string url) : base(url) { }
public override void ExecuteResult(ControllerContext context) {
if (context.RequestContext.HttpContext.Request.IsAjaxRequest()) {
string desturl = UrlHelper.GenerateContentUrl(Url, context.HttpContext);
JavaScriptResult result = new JavaScriptResult() {
Script = "window.location='" + desturl + "';" };
result.ExecuteResult(context);
}
else { base.ExecuteResult(context); }
}
}
Run Code Online (Sandbox Code Playgroud)
但是,它并不完整.挑战是: …
我正在将我们的MVC3项目转换为使用T4MVC.我想替换java-script包也可以使用T4MVC.所以我需要更换
"~/Scripts/DataTables/TableTools/TableTools.min.js"
"~/Scripts/jquery-ui-1.8.24.min.js"
Run Code Online (Sandbox Code Playgroud)
成
Scripts.DataTables.TableTools.TableTools_min_js
Scripts.jquery_ui_1_8_24_min_js
Run Code Online (Sandbox Code Playgroud)
我目前正在使用Notepad ++作为regexp工具,它正在使用POSIX正则表达式.我可以找到脚本名称并将其替换为这些正则表达式:
找: \("~/Scripts/(.*)"\)
用...来代替 \(Scripts.\1\)
但我无法弄清楚如何将文件名中的点和短划线替换为下划线并将正斜杠替换为点.
我可以检查js-filename在名称中有点或短划线
\("~/Scripts/(?=\.*)(?=\-*).*"\)
Run Code Online (Sandbox Code Playgroud)
但是如何替换组内的组?
需要在组内进行非贪婪替换,并且这些替换按顺序进行,因此转换为点的正斜杠不会在之后转换为下划线.
这是一个非关键问题,我已经手动完成了所有替换,但我认为我对regexp很好,所以这个问题让我感到困惑!
ps首选工具是Notepad ++,但任何POSIX正则表达式解决方案都可以 - )
我正在尝试在Visual Web Developer 2008 Express Edition中使用T4MVC,但它并没有构建任何文件.快递版是否支持T4?
在我的应用程序中,我有控制器Snippets
在默认区域(在应用程序根目录中)和我的区域中命名Manage
.我使用T4MVC和自定义路由,如下所示:
routes.MapRoute(
"Feed",
"feed/",
MVC.Snippets.Rss()
);
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
找到了多个匹配名为"snippets"的控制器的类型.如果为此请求提供服务的路由('{controller}/{action}/{id} /')未指定名称空间来搜索与请求匹配的控制器,则会发生这种情况.如果是这种情况,请通过调用带有'namespaces'参数的'MapRoute'方法的重载来注册此路由.
对'snippets'的请求找到了以下匹配的控制器:Snippets.Controllers.SnippetsController Snippets.Areas.Manage.Controllers.SnippetsController
我知道有用于重载MapRoute
称取namespaces
说法,但目前还没有这样的过载与T4MVC支持.可能是我错过了什么?可能的语法可以是:
routes.MapRoute(
"Feed",
"feed/",
MVC.Snippets.Rss(),
new string[] {"Snippets.Controllers"}
);
Run Code Online (Sandbox Code Playgroud)
或者,将名称空间作为T4MVC属性对我来说似乎相当不错:
routes.MapRoute(
"Feed",
"feed/",
MVC.Snippets.Rss(),
new string[] {MVC.Snippets.Namespace}
);
Run Code Online (Sandbox Code Playgroud)
提前致谢!
我写了一些剃刀助手,这些助手使用的功能包括T4MVC生成的扩展方法.我现在想将它们移动到控件库中,以便它们可以在多个mvc应用程序中使用.我使用的最初想法是我可以将模板的副本放入控件库,这是有效的,缺点是应用程序中使用的模板然后在同一名称空间中重新生成相同的扩展方法.因为我正在使用一些需要ActionResult接口的扩展,所以我需要命名空间保持不变.
我想知道的是,是否有一种已知的方法来使用控件库中的扩展以及引用该库的应用程序,或者是对所需模板的更改,以便可以生成或不通过生成静态扩展方法设置文件中的标志?我也想知道静态扩展是否可以包含在模板旁边的单独的cs文件中.那么我们有2个类T4Extensions和DynamicT4Extensions?
这可能会强制使用接口IT4MVCActionResult,
我们正在使用ASP.Net 4和MVC 3 Framework开发Web应用程序.我已经通过NuGet安装了T4MVC,所有的视图,控制器和静态内容都成功地生成为强类型.
但是,当我尝试编译项目时,它会在生成的文件T4MVC.cs中引发错误,这是:
'T4MVC_ViewResultBase.FindView(System.Web.Mvc.ControllerContext)':
return type must be 'System.Web.Mvc.ViewEngineResult' to match overridden member
'System.Web.Mvc.ViewResultBase.FindView(System.Web.Mvc.ControllerContext)'
Run Code Online (Sandbox Code Playgroud)
这是生成的源代码:
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class T4MVC_ViewResultBase : System.Web.Mvc.ViewResultBase,
IT4MVCActionResult
{
public T4MVC_ViewResultBase(string area, string controller, string action):
base() {
this.InitMVCT4Result(area, controller, action);
}
protected override void FindView(System.Web.Mvc.ControllerContext context){}
public string Controller { get; set; }
public string Action { get; set; }
public RouteValueDictionary RouteValueDictionary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
错误说:
protected override void FindView(System.Web.Mvc.ControllerContext context) { }
Run Code Online (Sandbox Code Playgroud)
应该:
protected override ViewEngineResult
FindView(System.Web.Mvc.ControllerContext …
Run Code Online (Sandbox Code Playgroud) 问题:
我构建时遇到以下错误:
"'.Controllers.ControllerBase'不包含带0个参数的构造函数"
我的基本控制器看起来像这样:
public abstract class ControllerBase : Controller
{
public CompanyChannel<IAuthorizationService> authorizationServiceClient;
public ControllerBase(CompanyChannel<IAuthorizationService> authService)
{
this.authorizationServiceClient = authService;
}
}
Run Code Online (Sandbox Code Playgroud)
一个使用Base的示例控制器..
public partial class SearchController : ControllerBase
{
protected CompanyChannel<IComplaintTaskService> complaintTaskServiceChannel;
protected IComplaintTaskService taskServiceClient;
protected ComplaintSearchViewModel searchViewModel;
#region " Constructor "
public SearchController(CompanyChannel<IComplaintTaskService> taskService, CompanyChannel<IAuthorizationService> authService, ComplaintSearchViewModel viewModel)
: base(authService)
{
searchViewModel = viewModel;
this.complaintTaskServiceChannel = taskService;
this.taskServiceClient = complaintTaskServiceChannel.Channel;
}
#endregion
public virtual ActionResult Index()
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎是绊倒T4MVC.
我应该不将params传递给基础构造函数吗?
当使用 T4MVC 并尝试“运行自定义工具”时,我得到了这个:
正在运行转换:System.InvalidCastException:无法将“System.__ComObject”类型的 COM 对象转换为接口类型“EnvDTE80.CodeClass2”。此操作失败,因为 IID 为“{295ADCD4-B052-49EE-934E-C6B36862A7C6}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE)) .
这会影响整个机器,而不是单个项目。
我试过了:
ASP.NET 5 中尚不支持 T4MVC。还有其他类似的解决方案吗?我需要强类型视图和控制器名称。
我在这个项目中使用T4MVC已经好几个月而没有问题.但是今天每次更改控制器方法时,它都会生成两个T4MVC文件:
而不是更新T4MVC.cs,这最终意味着项目不能编译,我必须删除T4MVC1.cs.
有没有人看过这种行为或有一些修复的想法?