簡単にあなたの質問に答えるために、はい、私はあなたが「ハードコードされた」とリストした両方の例を検討します。2番目の@Url.Actionは、ハードコードされていません。暗示される特異性は低くなります。プロジェクトのルートを変更した場合、2番目のルートは引き続き機能しますが、@ Peter Jが述べたように、最初のプロジェクトは機能しません。また、エリアを使用してエリア名を変更した場合、2番目のプロジェクトは機能すると思いますが、最初のプロジェクトは機能します。壊れます。
ただし、もう少し役立つように、3番目のアプローチを使用します。1か月前に正確に質問がありましたが、静的コントローラーURL(魔法の文字列)を使用しないASP.NET MVC AJAX呼び出しのおかげで、非常にうまく機能するプロセスがあります。
Index.cshtml
<input data-action='@Url.Action(Mvc.AutoComplete.PostalCode())' type='text' name='postalCode' class='autoComplete'><input>
<input data-action='@Url.Action(Mvc.AutoComplete.ProductCategory())' type='text' name='productCategory' class='autoComplete'><input>
main.js
$('input.autoComplete').each(function () {
var el = $(this);
el.autocomplete({source: el.data('action')});
});
出来上がり!コンパイル時のチェックと、T4MVCおよびHTML5データ属性による責任の明確な分離。コントローラ定義は、それを使用するウィジェットから読み取られます。ページに複数回表示される可能性のある部分ビューに最適です。
「Mvc」であるT4MVCを使用することを強くお勧めします。サンプルビューに表示される構文。'ハードコーディング'を避けようとしている場合、それはあなたがこれのために得ることができるのとほぼ同じくらい動的です。私はT4MVC(http://t4mvc.codeplex.com/)を使用しているので、ビュー内のコントローラーとアクションを参照するための「マジックストリング」を回避できます。T4MVCは完璧ではありませんが、大きな改善です。非表示のT4MVCファイルの内部には、ハードコードされた値がまだありますが、それらは表示されません。コントローラーから自動的に生成され、コンパイル時にチェックされます。
また、@ Valamasによってすでに提案されているように、HTML要素のデータ属性を使用して、ビューからjavascriptにそれらのURLを渡します。
ページにAJAX呼び出しがある場合は、特にこのデータ属性アプローチを使用します。1つのページに10個のURL依存関係がある可能性があり、条件付き機能を完全にカバーしていない可能性があるユーザーテストによってリンクが壊れているかどうかを判断するのは困難です。でも、やったー!T4MVCは、リンクが存在しない場合にコンパイル時エラーをスローします。コードがinitのすべてのデータ属性検査で編成されている場合、対応するデータ属性が欠落している場合(実行時エラーではなく)、javascriptはロード時エラーをスローします。未定義の変数を取得します)。これにより、JavaScriptの単体テストを行っていない場合でも、リンケージの欠陥をより早く/簡単に検出できます(私はそうではありません)。
私は通常、すべてのページに標準のヘッダーがあり、BODY要素またはdisplay:none SPANに既知のIDのデータ属性として現在のグローバルに役立つ情報(たとえば、UserId)が含まれています。
次に、通常、JavaScriptコード(またはそれを必要とする各JavaScriptファイル)の上部に近い単一の場所にある属性からすべてのデータをロードします。
これの利点は何ですか?これで、必要なすべての埋め込みデータパラメータがJavaScriptに提供されていることを確認するための単一の場所ができました。JavaScriptは未定義の変数を参照しないため、JavaScriptIDEを使用しても誤ったエラーは発生しません。あなたのJavaScriptを見ている開発者は、他のJavaScriptファイルでミステリー変数の宣言を見つけようとして頭を悩ませることはありません。ASP.NET MVC開発者でもない場合は、特に面倒です。その点で、別々の言語チームがある場合、実装の責任はより明確になります(JavaScript開発者は、命名規則を変更するとき、またはその逆のときにビューを編集することはありません)。また、変数は、クライアントページのライフサイクル中のよく知られた時点で定義されます。これは、JavaScriptをデバッグするための大きな利点です。また、ビューにページ全体に飛び散ったjavascriptが含まれていないため、ページの途中でHTMLに小さな欠陥があると、予期せずに完全なjavascriptが失敗する可能性があります。
さらに、例に示されているように、これは、ページ上で複数回発生する可能性のある部分的なビューを飛ぶ唯一の方法です。埋め込まれたデータを、それを使用する個々のHTMLウィジェットに明確に関連付けることができます。JavaScriptをビューに直接接続すると、変数を誤って再定義することになります。
メリットのリストはどんどん増えていきますが、基本的には責任の分離に帰着します。他のすべてはそれから続きます。