8

次のjQuery呼び出しを見ています:

$.get('/Home/GetResult', null, function (data) {

    alert(data);

});

これは、次のものと比較して、これを行う「ハードコード」方法と呼ばれていることがわかります。

$.get('@Url.Action("GetResult", "Home")', function (data) { 

    alert(data);

});

これは、これを行うためのハードコードされていない方法と呼ばれています。

誰かが私にこれが何であるかを説明してもらえますか? どちらの方法でも、コントローラーとメソッドの明示的な名前があるため、これを呼び出す方法は同じようにハードコードされているようです。

一方がハードコードされ、もう一方がそうではない理由を誰かが知っていますか。1つが良いですか?

4

5 に答える 5

5

URL をハード コードすると、後でルーティング スキームを変更できなくなります。そのため、常にURL ヘルパー メソッドを使用してください。URL ヘルパーを使用すると、ヘルパー メソッドが変更を処理します。100 か所変更する必要はありません。また、ホーム ページと内部ページから同じメソッドが呼び出されているときに、プレフィックスとして ../ をいくつ追加する必要があるかを心配する必要はありません。

Darinによるこれらの回答をチェックしてください

https://stackoverflow.com/a/7492024/40521

https://stackoverflow.com/a/6454041/40521

于 2012-07-24T21:43:04.880 に答える
4

"/Home/GetResult" は、開発者が構成値をコードに直接入力したため、"ハード コーディングされた" と見なされます。将来変更するのはより困難です。

このビュー (および関連するコントローラー アクション) がアプリケーション内の別の「領域」に移動すると、「/Home/GetResult」が破損するため、URL 値を具体的にハードコードするのはさらに悪いことです。@Url.Action メソッドの方が優れています。

于 2012-07-24T21:43:36.953 に答える
2

Peter J の回答が気に入っています。加えて

URL は、href の一部として、または html 要素の属性として指定する必要があります。

E.g <a data-getresult="@Url.Action("GetResult", "Home")">click</a>

その後

var clickAction = $(this).attr('data-getresult');
$.get(clickAction, null, function (data) {

    alert(data);

});

上記を関数でラップし、属性名を介してクリック イベントにリンクします。

于 2012-07-24T21:45:35.863 に答える
1

簡単にあなたの質問に答えるために、はい、私はあなたが「ハードコードされた」とリストした両方の例を検討します。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をビューに直接接続すると、変数を誤って再定義することになります。

メリットのリストはどんどん増えていきますが、基本的には責任の分離に帰着します。他のすべてはそれから続きます。

于 2012-07-25T03:42:55.713 に答える
0

ほとんどの場合、彼らは同じことを達成します。

基本的に、エリアのない単純な MVC サイトがあり、デフォルトのルート定義を使用している場合、大きな変化に気付くことはありません。ただし、ルート定義をカスタマイズしたり、アプリでエリアを使用したりすると、問題が発生する可能性があります。可能であれば、ソフト コード化された方法を使用することをお勧めします。これは、URL を JavaScript ファイルに埋め込む必要がある場合に問題になります。ただし、この場合は通常、実装に問題があることを示しており、JS ファイル内のコードは、外部 JS ファイルに URL を埋め込むのではなく、パラメーターとして使用する URL を受け入れる必要があります。

于 2012-07-24T21:50:31.617 に答える