【问题标题】:T4MVC not generating an actionT4MVC 不生成动作
【发布时间】:2010-04-10 04:11:20
【问题描述】:

我怀疑某处存在某种隐藏的魔法,它阻止了 T4MVC 中所有看似实际的方法调用。然后我的视图编译失败,stackTrace 进入了我的实际方法。

        [Authorize]
    public string Apply(string shortName)
    {
        if (shortName.IsNullOrEmpty())
            return "Failed alliance name was not transmitted";
        if (Request.IsAuthenticated == false || User == null || User.Identity == null)
            return "Apply authentication failed";
        Models.Persistence.AlliancePersistance.Apply(User.Identity.Name, shortName);
        return "Applied";
    }

所以这个方法毕竟不是在模板中生成的。

<%=Ajax.ActionLink("Apply", "Apply", new RouteValueDictionary() { { "shortName", item.Shortname } }, new AjaxOptions() { UpdateTargetId = "masterstatus" })%>

            <%=Html.ActionLink("Apply",MVC.Alliance.Apply(item.Shortname),new AjaxOptions() { UpdateTargetId = "masterstatus" }) %>

第二种方法在编译时抛出异常,因为我的控制器中的方法Apply 有一个[Authorize] 属性,所以如果没有登录的人点击这个,他们会被重定向到登录,然后马上回到这个页。在那里他们可以再次点击应用,这次是登录。

是的,我意识到一个是 Ajax.ActionLink 而另一个是 Html.ActionLink 我确实在 T4MVC 版本中尝试了它们。

【问题讨论】:

    标签: asp.net-mvc t4mvc


    【解决方案1】:

    更新:我看到了问题。 T4MVC 仅支持返回 ActionResult 的操作,因此它不处理返回字符串的特定操作。您可以通过如下更改来解决此问题:

        [Authorize]
        public ActionResult Apply(string shortName) {
            if (shortName.IsNullOrEmpty())
                return Content("Failed alliance name was not transmitted");
            if (Request.IsAuthenticated == false || User == null || User.Identity == null)
                return Content("Apply authentication failed");
            Models.Persistence.AlliancePersistance.Apply(User.Identity.Name, shortName);
            return Content("Applied");
        }
    

    注意它如何返回一个 ActionResult,并调用 'return Content("...")' 而不是直接返回字符串。


    您能否提供有关您遇到的编译异常的更多详细信息?我认为这是您在浏览器中看到的,而不是在 VS 中看到的?能否附上错误的全文?

    通常,通过 MVC 前缀的 T4MVC 调用绝不应该调用实际的操作方法。相反,它们调用派生类中的重写方法。查找名为 AllianceController.generated.cs 的生成文件(在 T4MVC.tt 下)。您应该在其中看到一个被覆盖的“应用”方法,它正好满足 T4MVC 的需要。

    【讨论】:

    • 我在模板上运行自定义工具时收到以下警告:警告编译转换:假设程序集引用'EnvDTE,版本=7.0.3300.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a'匹配'EnvDTE,版本=8.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a',you may need to supply runtime policy. Warning 编译转换:Unreachable code detected T4MVC.tt line 788。并且未生成 apply 方法。使用其他代码/异常信息更新问题。
    • 这只是一个良性警告,与您的问题无关。
    猜你喜欢
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2018-04-01
    相关资源
    最近更新 更多