1

ASP.NET MVC の TextBox を拡張して、CSS 値を (モデルのデータに基づいて) 条件付きで切り替えるようにしたいと考えています。ただし、そのロジックをビューに配置したくはありません (条件付きで htmlAttributes を変更するか、メソッド呼び出しを介して)。代わりにクラスを拡張して、ビューが乱雑にならないようにします。基本的に、作成時に TextBox がモデルを見て、独自の名前の辞書エントリがあるかどうかを確認し、見つかった場合は関連する CSS 値を検索する必要があります。

私が遭遇する問題は次のとおりです。

1) 延長するにはどうすればよいですか? TextBox 自体はすでに拡張メソッドであり、クラスではないため、「継承」できませんか?

2) TextBox の属性に影響を与える条件をコントローラー メソッドから TextBox にどのように伝達しますか?

4

4 に答える 4

4

おそらく、テキスト ボックスをモデルに結合しないでください。常に、依存関係を 1 つの方法で保持することをお勧めします。モデルからビューへ。

したがって、間接的な答えは、列挙型またはブール値を受け入れ、これに応じてクラス名を追加するかどうかに応じて、さらに別の拡張メソッドを用意することです。

<%= Html.StyledTextBox("myField", ViewData["ShouldBeStyled"]) %>

直接回答もあります。

ASP.NET MVC を拡張するには、独自の拡張メソッドを作成する必要があります。下線拡張メソッドはいつでも呼び出すことができます。したがって、コードは次のようになります。

public static class MyCoolExtension
{
  public static string TextBox(this HtmlHelper htmlHelper, string name)
  {
     // get data from htmlHelper.ViewData and call another extension methods of the HtmlHelper 
    var className = htmlHelper.ViewData["someClass"];
    return htmlHelper.TextBox("myField", "30", new { @class = className });
  }
}
于 2009-08-18T07:30:57.433 に答える
1

できることの 1 つは、ViewData を使用して目的の CSS クラスをビューに渡すことです。これにより、ビューはこれを行うためのロジックを認識する必要がなくなります。

具体的な質問に答えるには、

1: その通りです。これを拡張することはできませんが、ここに 2 つの代替案があります。自分の。必要に応じて、MVC ソース コードをダウンロードして、そこから直接作業することができます。

2: コントローラーで何かを考えてみましょう:

if (someCondition)
{
    ViewData["someClass"] = "foo";
}
else
{
    ViewData["someClass"] = "snazzle";
}

そしてあなたの見解では:

<%= Html.TextBox("myField", "30", new { @class = ViewData["someClass"] }) %>

頑張ってください!
-f!

于 2009-08-18T07:26:51.543 に答える
0

これが、MVCチームがどこでも文字列を使用するという決定に非常に不満を持っている理由です。クラスをテキストボックスに追加することは、TextBox HtmlHelperの関心事ではなく、HTML構築の別の側面である必要があります。これは、セマンティックモデルを使用してHtmlを定義するためのより良いソリューションです。ここではTagBuilderを使用しますが、FubuMvcに含まれているHtmlTagsライブラリを調べることを強くお勧めします。

public TagBuilder TextBox(this HtmlHelper helper, string name, string value)
{
   var tag = new TagBuilder("input");
   tag.MergeAttribute("type", "text");
   tag.MergeAttribute("name", name);
   tag.MergeAttribute("value", value);
   return tag;
}

セマンティック(TagBuilder)モデルを返すので、HTMLリテラルに変換する前に、モデルを変更し続けることができます。ConditionallyAddClassは、任意のTagBuilderモデルにクラスを適用する再利用可能な拡張メソッドです。

public TagBuilder ConditionallyAddClass<T>(this TagBuilder tag, string @class, T model, Func<T, bool> condition)
{
   if(condition(model))
   {
      tag.AddCssClass(@class);
   }
   return tag;
}

あなたの見解では、これを行うことができます(StyleAgeTextboxがブール型のプロパティであると仮定):

<%= Html.TextBox("Age", Model.Age).ConditionallyAddClass("customClass", Model, m => m.StyleAgeTextbox) %>

ビューエンジンは、TagBuilderでToString()を自動的に呼び出して、適切なHTMLを取得します。

これがあなたに基本的な考えを与えることを願っています。もちろん、これを拡張する方法はたくさんあります。標準の命名規則を使用して、dynamic式を使用して回避するための型を使用するか、ルックアップテーブルを使用するか、メンバー式を使用するためにすべてを強く型指定することができます(例:TextBoxFor(m => m.Age))。私はFubuのようにすべてをhtmlコンベンションフレームワークに移動することを好みます、それはおそらくほとんどのプロジェクトを超えています。

于 2010-07-20T20:02:02.373 に答える
0

重要度によっては、jQuery を使用してフォーマットを適用することもできます。特定のテキストボックスを選択するのは非常に簡単です。

JavaScript が無効になっている (無視できない) ユーザーのグループが存在するため、「それがあなたにとってどれだけ重要かによる」と言えます。この場合、書式設定は適用されません。

于 2009-08-18T10:23:20.877 に答える