しばやん雑記

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

SwissKnife.Mvc の 0.0.2 を NuGet でやっと公開しました

NuGet Gallery | SwissKnife.Mvc 0.0.17

もうちょっと説明とかしっかり書けという感が満載なんですが、とりあえずいろいろと実装したかなと思ったので公開してみました。リファレンスなんて立派なものはまだないので、このエントリに基本的な機能を書いておきます。

ちなみにサンプルコードに出てくるクラスやプロパティは https://github.com/shibayan/SwissKnife/tree/master/SwissKnife.Web にあるので適当に補完してください。

HTML ヘルパー

SwissKnife.Mvc.Html 名前空間の中に全て存在してます。使う時には当然ながら using が必要です。

DisplaySelectFor ヘルパー

SelectList の Value から Text への変換を行って出力するヘルパーです。ドロップダウンリストやラジオボタンで選択された値を、確認画面とかで表示することを想定してます。

@* int から表示文字列への変換を行う *@
@Html.DisplaySelectFor(model => model.PrefectureId)

CheckBoxListFor / RadioButtonListFor ヘルパー

名前の通り、チェックボックスとラジオボタンを出力するヘルパーです。SelectList を使って項目一覧を生成するようにしています。

@* チェックボックスリストを表示する(複数選択が可能) *@
@Html.CheckBoxListFor(model => model.ColorId)

@* ラジオボタンリストを表示する *@
@Html.RadioButtonListFor(model => model.ToggleId)

ちなみに CheckBoxListFor に指定するプロパティは配列じゃないとエラーになります。

DropDownListExFor ヘルパー

標準のドロップダウンリストはラムダ式で指定した場合に初期値が反映されなかったりするので、このヘルパーそれらの問題を修正したものになります。

@* ドロップダウンリストを表示する *@
@Html.DropDownListExFor(model => model.PrefectureId)

IsValidationError / GetValidationMessages ヘルパー

ASP.NET MVC の標準のエラー表示ヘルパーだと、出力される HTML 要素が固定になってしまうので、柔軟にテンプレートを定義するために最低限の機能だけ実装したヘルパーです。

@* エラーが存在する場合には表示 *@
@if (Html.IsValidationError())
{
    <ul>
    @foreach (var message in Html.GetValidationMessages())
    {
        <li><span class="color: red;">!@message!</span></li>
    }
    </ul>
}

GetValidationMessages は全てのエラーメッセージを列挙可能な形で返します。

検証属性

SwissKnife.Mvc 名前空間の中に存在しています。残念ながらクライアントサイド検証には対応していません。

Contains 属性

バインドされた値が、属性のコンストラクタで指定されたプロパティのコレクションに存在しているか検証します。ドロップダウンリストやラジオボタンと組み合わせることを想定しています。

// PrefectureList に存在している値か検証する
[Contains(typeof(Master), "PrefectureList")]
public int PrefectureId { get; set; }

プロパティの型は IEnumerable に変換可能じゃないとエラーになります。

PostalCode 属性

名前の通り日本式の郵便番号として正しいか検証する属性です。ハイフンが必要とかちょっと残念なので、実装を変えるかもしれません。

[PostalCode(ErrorMessage = "郵便番号が不正です。")]
public string PostalCode { get; set; }

PhoneNumber 属性

こちらも名前の通り日本式の電話番号として正しいか検証する属性です。こちらもハイフンが必要とかちょっと残念なので、実装を変えるかもしれません。

[PhoneNumber(ErrorMessage = "電話番号が不正です。")]
public string PhoneNumber { get; set; }

アクションフィルタ

アクションに指定できる属性です。SwissKnife.Mvc 名前空間の中に存在しています。

DisplayMode 属性

この間、このブログで作成した属性です。同じ実装のまま SwissKnife.Mvc に追加してあります。

// スマートフォンの場合に実行されるアクション
[DisplayMode("Mobile")]
public ActionResult Index(string userAgent)
{
    return View();
}

NoClientCache 属性

ブラウザ側でページをキャッシュさせたくない時に使う属性です。OutputCache 属性では Cache-Control ヘッダの値が不足しているので作りました。

[NoClientCache]
public ActionResult Login()
{
    return View();
}

ログイン画面などのようにページがキャッシュされてしまい、再度 POST されたら困る場所で使います。

NoOutputCache / OutputCacheEx 属性

標準の OutputCache 属性はグローバルフィルタやコントローラ単位に付けると、それを無効化することはできませんが、OutputCacheEx 属性と NoOutputCache 属性を使うことで、コントローラの一部のアクションだけキャッシュを無効にすることが出来ます。

[OutputCacheEx(Duration = 10)]
public class HomeController
{
    // このアクションはキャッシュされない
    [NoOutputCache]
    public ActionResult Index()
    {
    }
}

その他

ユーティリティ的な機能です。今のところは SelectList 周りしか用意されていません。

ToSelectList 拡張メソッド

IEnumerable> から IEnumerable を作成する拡張メソッドです。

// SelectList を作成する
var selectList = dictionary.ToSelectList();

SelectListExtensions.ToSelectList メソッド

enum 型から IEnumerable を作成する拡張メソッドです。enum 型のフィールドに Display 属性で名前を付けることが出来ます。

public enum Toggle
{
    [Display(Name = "オフ")]
    Off = 0,

    [Display(Name = "オン")]
    On
}

// SelectList を作成する
var selectList = SelectListExtensions.ToSelectList<Toggle>();

今更になりますが、SwissKnife.Mvc は SelectList を活用するように作ってあります。

なので、マスターとして SelectList を用意しておくと多分幸せになれます。