2

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" }) %>

2番目のメソッドは、コンパイル時に例外をスローしました。これApplyは、コントローラーのメソッドに[Authorize]属性があり、ログオンしていない人がこれをクリックすると、ログインにリダイレクトされてから、このページに戻るためです。そこで、もう一度[適用]をクリックして、今度はログインします。

そして、はい、一方はT4MVCバージョンで両方を試しましたAjax.ActionLinkが、もう一方はそうであることに気付きました。Html.ActionLink

4

1 に答える 1

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 の下) のような名前の生成されたファイルを探します。T4MVC が必要とすることだけを行うオーバーライドされた「Apply」メソッドがそこにあるはずです。

于 2010-04-10T05:38:36.490 に答える