MVC4かみそりはブレースについて混乱しています
-
28-10-2019 - |
質問
カミソリの専門家全員にかなり簡単な質問があります。 url.content()を使用して、jquery $ .ajax()urlへの呼び出しを作成しようとしています。そうすることで、Razorは私の@Sectionの終わりがどこにあるかについて少し混乱しています。私はURLインラインを指定できることを好みますが、それを行うと、Razorは$ .AJAX()パラメーターリストの終わりが私の@Sectionの終わりであると考えています。レイアウトを使用して各ファイルの下部にJavaScriptを配置するため、@Sectionを使用しています。レザーがそんなに混乱するのはなぜですか? @(url.content(...))を使用してみましたが、それも機能しません。
また、これは問題にアプローチするための最良の方法ですか? ASP.NET MVC 4プレビューを使用しています。
これは機能します:
@section Scripts {
<script type="text/javascript">
var getMessagesUrl = '@Url.Content("~/Logging/GetMessages")';
$(document).ready(function () {
$.ajax({
url: getMessagesUrl,
dataType: 'html',
success: function (result) {
$('tbody').html(result);
}
});
});
</script>
}
これはそうではありません:
@section Scripts {
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
url: '@Url.Content("~/Logging/GetMessages")',
dataType: 'html',
success: function (result) {
$('tbody').html(result);
}
}); //Razor thinks this is the curly-brace that ends the section!
});
</script>
}
解決 5
すべての助けに感謝します、人々。
ASP.NET MVC 4プレビューのバグであったに違いないようです。 2月15日に発表されたASP.NET MVC 4ベータにアップグレードしましたが、問題は完全になくなりました。
他のヒント
これは、パーサーの動作にかかっている可能性があります。それが遭遇するとき @
シンボル、パーサーはコードモードに切り替え、暗黙の式を読み取ります Url.Content("~/Logging.GetMessages")
(まあ、実際にはまで読みます '
シンボル、それが式の有効な文字ではないと判断し、トラックバックは終了するまで戻ります )
. 。この段階の後、パーサーはあなたのビューと少し混乱しています。 }
キャラクター、そしてそれがコードスパンの終わりだと考えています。
現実には、C#を使用してかみそりビュー内でJavaScriptを使用する場合は、非常に注意する必要があります。コードへの移行は明示的です @
そしてaの後 {
, 、しかし、マークアップへの移行を決定するのは少し難しいです。
Razorはさておき、私の推奨事項は、JavaScriptアプリケーションコードを外部ファイルに貼り付け、Data-*属性を活用してメタ情報をアプリケーションコードに伝えることです。
<script id="messageScript" type="text/javascript"
src="/Scripts/messages.js"
data-messages="@Url.Content("~/Logging/GetMessages")"></script>
どのようにアクセスできますか:
(function($) {
$(function() {
var $this = $("#messageScript");
$.ajax({
url: $this.attr("data-messages"),
type: "html",
success: function(result) {
$("tbody").html(result);
}
});
});
})(window.jQuery);
アップデート: デイブのシンボルよりも少ないことは問題を引き起こしていませんでした。
MVC4では、この問題を分離することができました。これはコンパイルされません:
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
url: '@Url.Content("~/Logging/GetMessages")',
dataType: 'html',
success: function (result) {
$('tbody').html(result);
}
}); //<-- test
});
</script>
しかし、これは次のとおりです。
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
url: '@Url.Content("~/Logging/GetMessages")',
dataType: 'html',
success: function (result) {
$('tbody').html(result);
}
}); //-- test
});
</script>
それはただのようです < それを投げていたコメントで。
マシューの答えは行動をほとんど説明しています(正直なところ、私はあなたの問題を再現することはできません - それがうまくいかない理由はわかりません - 両方の例はここで正常に実行されます)。別のアプローチについては、アクション/ビューを生成されたJavaScript変数(URL、設定、ローカライズされたテキストなど)に専念することができます。
// Could/should be OutputCached depending on the scenario
public ActionResult Globals()
{
var model = new ClientGlobalsModel();
// ClientGlobalsModel has a single (could be more) Dictionary<string, string>
// (Urls) and a ToJSON() method which uses JavaScriptSerializer to serialize
// the object:
model.Urls.Add("GetMessages", Url.Content("~/Logging/GetMessages"));
// I mostly use this method for e.g. actions:
model.Urls.Add("UploadImage", Url.Action("Upload", "Image"));
Response.ContentType = "text/javascript";
return View(model);
}
Globals.cshtml:
@model ClientGlobalsModel
@{
Layout = null; // If you have a layout supplied in e.g. _ViewStart
}
var GLOBALS = @Model.ToJSON()
ええ、これは簡単だったかもしれません Content()
ビューではなく結果 - より多くのグローバル(設定 + URLS +テキストなど)がある場合、スクリプトの出力を簡単に制御し、各辞書を個別にシリアル化することができます。また、グローバルな範囲の汚染を避けるために、一部の共有アプリケーションネームスペースの「Globals」変数を名前を付けたい場合があります。
(例)index.cshtml:
<script src="@Url.Action("Globals", "Client")"></script>
<script src="@Url.Content("~/Scripts/main.js")"></script>
... /クライアント /グローバルからの出力を単に含む。そして、「main.js」、私たちはあなたのスクリプトの残りの部分を移動しました:
main.js(static):
$(document).ready(function () {
$.ajax({
url: GLOBALS.Urls.GetMessages,
dataType: 'html',
success: function (result) {
$('tbody').html(result);
}
});
});
もちろん、同じ種類のアプローチを使用して、いくつかのユーザー/コンテキスト/ビュー固有の設定をビューに直接出力できます。いくつかのURLまたはデータの場合、データ - *属性アプローチは、好みに応じて優れている場合があります。私は詰め物のファンではありません トン ただし、基本的にはすべてのHTMLページの属性への設定があります。
最終的なMVC4 / Visual Studio 2010の問題のようですが、ここに私の修正があります。
@section jQueryDocumentReady
{
@{
<text>
// All the javascript and bracers you want here
</text>
}
}