我怀疑在某个地方有一些隐藏的魔法可以阻止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版本尝试了它们。
答案 0 :(得分:2)
更新:我看到了问题。 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下)的生成文件。你应该在那里看到一个被覆盖的'Apply'方法,这就是T4MVC所需要的。