質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

3回答

2960閲覧

new { ... }内で@をつける意味は?

mika33532

総合スコア27

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2018/02/17 16:26

編集2018/02/18 08:51

いつもお世話になっております。

ASP.NET MVCのサンプルコードでこのような「@」の使い方を見かけるのですが、どのような時に付ければよいのでしょうか?

C#

1@Html.DropDownList("test", items, new { @class = "form-control", disabled = "disabled" }) 2

イコールの右側で「@」を使うコードも見かけました。

C#

1@Html.EditorFor(model => model.Name , new { htmlAttributes = (object)@ViewBag.HtmlAttributes_EditorFor }) 2

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/02/18 06:32

MVC4 のタグが付いてますが、間違いないでしょうか? 違うようでしたら、ASP.NET または ASP.NET MVC Framework への変更をお願いします。
guest

回答3

0

ベストアンサー

new { ... }内で@をつける意味は?

(1) 前者

@class = "form-control" の 場合は、mika33532 さんが言われるように、class が C# の予約語(キーワード)だからです。

new { ... } というのは匿名クラスの初期化で、その中の class = "form-control" の = の左辺が匿名クラスに含まれるのプロパティの名前、= と右辺でプロパティに文字列(正確に言うと String 型オブジェクトへの参照)を代入しています。

プロパティの名前は識別子の要件を満たす必要がありますから、それに C# の予約語の class をそのまま使うことはできません。なので @ を付与して識別子名として使えるようにしています。(コンパイラには @ は無視されて class という識別子と見なされます)

C# の予約語の他に、html 要素の属性としてよくある名前で、C# の識別子として使えないケースではハイフン '-' を含む属性名があると思います。例えば html 要素に data-date="12-02-2012" という属性を設定したい場合。

その場合はハイフン '-' に代えてアンダースコア '_' を使います。@class の例と合わせて書くと以下のようになります。

new { @class = "coolTextBox", data_date = "12-02-2012" }

上記コードが ASP.NET によって html に変換されると、@class の @ は無視され、'_' は '-' に変換されて以下のようになります。

class="coolTextBox" data-date="12-02-2012"

(2) 後者

new { htmlAttributes = (object)@ViewBag.HtmlAttributes_EditorFor } の @ ですが、上記 (1) のケース(C# の予約語を識別子名に使う)とは違って、たぶんこのコードを書いた人はコードブロックを意識して @ を付与したのではないかと思います。(Razor のコードブロックは @ で始まります)

だたし、質問者さんがアップされたコードの構文ですと、Razor ビューエンジンは (object)@ViewBag.HtmlAttributes_EditorFor の @ が無くてもコードブロックをとして認識してくれますので、@ は不要なはずです。

ついでに言うと、この場合は (object) というキャストも不要のはずです。( Html ヘルパの引数に直接 ViewBag を設定する場合はキャストが必要ですが。このコードを書いた人は多分そのあたりと混同しているのではないかと思います)

(3) 最後に

new { htmlAttributes = ... } というような構文は EditorFor で属性を追加するケースで使わないと意味はないので注意してください。TextBoxFor などに使うと htmlAttributes="..." という意味のない属性が追加されるだけになります。

EditorFor に以下のように使って初めて意味があります。

@model AdventureWorksLT.Customer @{ ViewBag.HtmlAttributes_EditorFor = new { @class = "coolTextBox", data_date = "12-02-2012" }; } @Html.EditorFor(m => m.CompanyName, new { htmlAttributes = new { @class = "coolTextBox", data_date = "12-02-2012" } }) @Html.EditorFor(m => m.CompanyName, new { htmlAttributes = ViewBag.HtmlAttributes_EditorFor })

上記いずれも他の属性マージされて html では class="coolTextBox text-box single-line" data-date="12-02-2012" というようになります。

そのあたりの詳しい説明は以下の記事を見てください。記事によると MVC 5.1 以上でないとダメとのことですので注意してください。

Html.EditorFor and htmlAttributes
https://cpratt.co/html-editorfor-and-htmlattributes/

投稿2018/02/18 06:27

編集2018/02/18 06:42
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SurferOnWww様、ありがとうございます。

良い情報がなかなか見つけられなかったので
詳しい解説をしていただいてよく分かりました。
ありがとうございました。

投稿2018/02/18 08:48

mika33532

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

上のほうは、予約語(class)を使いたい時に@を付けるようです。

投稿2018/02/17 17:37

mika33532

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問