しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET MVC の小ネタ集

htmlAttributes でハイフンを含む属性を指定する

例えば form タグに accept-charset 属性を追加したい時、以下のように書けば動きそうですね。

@using (Html.BeginForm(null, null, FormMethod.Post, new { accept-charset = "utf-8" }))
{
    @Html.ValidationSummary(true)
    <fieldset>
        (省略)
    </fieldset>
}

しかしプロパティ名にハイフンを使うことが出来ないので、コンパイルエラーになってしまいます。

以下のように修正しましょう。

@using (Html.BeginForm(null, null, FormMethod.Post, new { accept_charset = "utf-8" }))
{
    @Html.ValidationSummary(true)
    <fieldset>
        (省略)
    </fieldset>
}

ASP.NET MVC 3 からアンダースコアを使うと、自動的にハイフンに置換してくれるようになりました。

ASPX を使わない場合はビューエンジンごと削除する

実はデフォルトでは aspx -> cshtml という順番でビューの検索が行われます。aspx を全く使っていない場合は、毎回 aspx の存在を確認に行くので非常に無駄です。

なのでビューエンジンごと削除してあげましょう。

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());

aspx を見に行かなくなるので、余計な I/O 操作が減ります。

Razor で部分ビューをレンダリングする方法は 3 つ

  • Html.Partial
    • ビュー名を指定します
    • MvcHtmlString を返すので @ を使います
  • Html.RenderPartial
    • ビュー名を指定します
    • 出力ストリームに直接書き込むのでコードブロックで使います
  • RenderPage
    • ファイルパスを指定します
    • HelperResult を返すので @ を使います

最後の RenderPage は WebPages の機能になるので MVC とはあまり関係ないです。

アクションフィルターで Result をセットすると後の処理を打ち切る

引数名 filterContext で渡されるコンテキストには Result プロパティが存在しています。このプロパティに ViewResult などをセットすると、それ以降の処理が行われることなく値がクライアントに返されます。

例えばアクションの実行前に呼び出される OnActionExecuting メソッド内でセットすると、アクションの処理自体を実行せずに結果を返すことが出来ます。

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    // Hauhau ビューを必ず返す
    filterContext.Result = new ViewResult
    {
        ViewName = "Hauhau",
    };
}