我有以下控制器操作:
[ChildActionOnly]
public virtual PartialViewResult ListActions(int id)
{
var actions = meetingActionRepository.GetAllMeetingActions(id);
return PartialView(actions);
}
Run Code Online (Sandbox Code Playgroud)
以及以下操作链接(使用t4MVC和razor语法)
<p>
@Html.RenderAction(MVC.MeetingActions.ListActions(Model.MeetingId))
</p>
Run Code Online (Sandbox Code Playgroud)
但是这给了我错误:
不能隐式地将类型void转换为对象
至于我可以告诉控制器动作是好的,那么什么可以给我这个错误?
我正在使用Partial Action将菜单直接渲染到布局,使用:
@Html.Action(MVC.Menu.Index())
Run Code Online (Sandbox Code Playgroud)
此操作确定要呈现的部分Menu.例如,公共菜单部分.在这些部分中,我也使用T4MVC来渲染链接:
<ul id="navHolder">
<li class="level1">
<ul class="mainMenu">
<li><b>@Html.ActionLink("Welcome", MVC.Home.Index())</b>
...
Run Code Online (Sandbox Code Playgroud)
出于某种原因,T4MVC呈现的网址最后包含"?Area =":
<ul id="navHolder">
<li class="level1">
<ul class="mainMenu">
<li><b><a href="/home/index?Area=">Welcome</a></b>
...
Run Code Online (Sandbox Code Playgroud)
我的项目中没有区域,我将"IncludeAreasToken"设置为false.奇怪的是,只有当我使用"@ Html.Action"渲染局部时才会发生这种情况 - 如果我将其拉入"@ Html.Partial",则不会渲染参数并且链接是干净且正确的.(我不想把它渲染为部分,所以请不要提供它作为建议;)
以前有人遇到这个吗?
所以我在运行时使用我的asp.net mvc3应用程序进入错误,当我检查代码时,我看到它上面有一个红线,错误列表说没有定义这样的函数,但它仍然可以正常编译.错误仅在运行时出现?我正在使用T4MVC,我希望它可以帮助我避免这样的问题!?
这是设计还是我在这里做错了什么?
上面的代码不应该编译,因为那里没有这样的方法!
它在运行时失败:
这种事情发生了很多,不仅仅是未定义的方法,甚至是变量等.
我已经使用T4MVC(FYI:v2.6.62)已经有一段时间了,我一直在慢慢地将代码转移到这种工作方式(减少对魔术字符串的依赖).
但我不得不停下来,因为由于某种原因,T4MVC无法将对象转换为URL,并且似乎只能处理原始类型(int/string/etc).
这是一个例子:
路线分解:
/MyController/MyAction/{Number}/{SomeText}
Run Code Online (Sandbox Code Playgroud)
类:
namespace MyNamespace
{
public class MyClass
{
public int Number { get; set; }
public string SomeText { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
控制器:
public class MyController
{
public virtual ActionResult MyAction(MyClass myClass)
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
视图:
<%= Html.Action(
T4MVC.MyController.Actions.MyAction(
new MyClass()
{
Number = 1,
SomeText = "ABC"
}
) %>
Run Code Online (Sandbox Code Playgroud)
最终结果如下:
/MyController/MyAction?myClass=MyNamespace.MyClass
Run Code Online (Sandbox Code Playgroud)
并不是
/MyController/MyAction/1/ABC
Run Code Online (Sandbox Code Playgroud)
还有其他人有这个问题吗?T4MVC这样的网址是否可用?
问题还在ASP.NET论坛上提出.
当我右键单击T4MVC.tt并选择"运行自定义工具"(即通过T4MVC.cs文件重建)时,我收到以下警告.
警告1个编译转型:假设集引用"EnvDTE,版本= 7.0.3300.0,文化=中性公钥= b03f5f7f11d50a3a"匹配"EnvDTE,版本= 8.0.0.0,文化=中性公钥= b03f5f7f11d50a3a",你可能需要提供运行时策略C:\ Development\EHealth-Trunk\src\EHealth.Web\T4MVC.tt 1 1
这真的没什么大不了的,我只是不喜欢在我的代码库中有(不必要的)警告......
有没有办法在其中创建一个带有哈希/磅/片段的强类型T4MVC ActionLink?
例如,这是我想要创建的链接:
<a href="/Home/Index#food">Feed me</a>
Run Code Online (Sandbox Code Playgroud)
但是没有可以做到这一点的T4MVC对象的扩展.
<%= Html.ActionLink("Feed me", T4MVC.Home.Index()) %>
Run Code Online (Sandbox Code Playgroud)
所以,我最终要做的是创建一个动作,然后以这种方式嵌入它:
<a href="<%= Url.Action(T4MVC.Home.Index()) %>"#food>Feed me</a>
Run Code Online (Sandbox Code Playgroud)
这不是很理想.任何人有任何想法/建议?
提前致谢
我正在使用t4mvc在我的项目中生成链接.我想在控制器动作中生成URL,这可以使用t4mvc完成吗?
我正在使用T4MVC,我不能使用预构建事件来运行TextTransform.exe,因为它依赖于EnvDTE,并且必须以Visual Studio作为主机运行.
如果我已经运行了一次自定义工具,它运行得很好,因为它在执行(AlwaysKeepTemplateDirty = true
)时会标记为脏,但是当你打开解决方案时,它不会在构建时运行,所以我想知道你是否可以通过EnvDTE运行t4作为预建活动?
T4MVC很酷,但我在项目中集成它有几个问题,任何帮助都非常适合:
我对所有操作都有这样的警告(我SnippetsBaseController
用作所有控制器类的基类:
警告26'Snippets.Controllers.ErrorController.Actions'隐藏继承的成员'Snippets.Controllers.Base.SnippetsBaseController.Actions'.如果要隐藏,请使用new关键字.C:\ projects_crisp-source_crisp\crisp-snippets\Snippets\T4MVC.cs 481 32个片段
是否可以使用强类型的自定义路由名称,例如,我的路由定义如下:
routes.MapRoute(
"Feed",
"feed/",
MVC.Snippets.Rss()
);
Run Code Online (Sandbox Code Playgroud)是否可以替换:
<%= Url.RouteUrl("Feed") %>
Run Code Online (Sandbox Code Playgroud)
有类似的东西:
<%= Url.RouteUrl(MVC.Routes.Feed) %>
Run Code Online (Sandbox Code Playgroud)
有强烈类型的静态文件链接真的很酷,但我<base />
在我的页面中使用,所以我不需要任何URL处理,我可以重新定义
T4MVCHelpers.ProcessVirtualPath
而不调整T4MVC.tt
自己吗?
T4MVC始终使用大写的控制器和动作名称生成链接,例如:/ Snippets/Add而不是/ snippets/add.是否可以生成小写?
我正在使用T4MVC和MVC2.
我有以下构建基块:
一个简单的实体接口,定义每个POCO实体必须具有long Id
属性:
public interface IEntity
{
public long Id;
}
Run Code Online (Sandbox Code Playgroud)一个简单的POCO类,它实现了IEntity
接口并具有一些字符串属性:
public class CD : IEntity
{
public long Id { get; set; }
public long Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)基础控制器:
public abstract class EntityController<T> : Controller where T : class, global::IEntity
{
public EntityController(IEntityManager<T> manager);
}
Run Code Online (Sandbox Code Playgroud)我在my中使用这个基本控制器CDController
(其中CDManager
实现了IEntityManager
接口,这是一个UnitOfWork模式来添加CRUD功能):
public partial class CDController : EntityController<CD>
{
public CDController() : base(new CDManager()) { }
}
Run Code Online (Sandbox Code Playgroud)当我运行我的t4模板时,会生成以下代码:
namespace MyApp.Web.Controllers …
Run Code Online (Sandbox Code Playgroud) t4mvc ×10
asp.net-mvc ×7
c# ×2
envdte ×2
.net ×1
constructor ×1
controller ×1
macros ×1
razor ×1
t4 ×1