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/