Ответ Мэтью в значительной степени объясняет поведение (хотя, если честно, я не могу воспроизвести вашу проблему - и не вижу, почему она не сработает - оба ваших примера работают отлично).Для другого подхода вы можете выделить действие / представление для сгенерированных переменных 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()
результат, а не представление - но когда у вас больше глобальных объектов (например, настройки + URL-адреса + тексты), вы можете захотеть упростить контроль над выводом скрипта и, возможно, сериализовать каждый словарь индивидуально.Может также потребоваться указать пространство имен этой переменной «GLOBALS» в некотором общем пространстве имен приложения, чтобы избежать загрязнения глобальной области.
(например) Index.cshtml:
<script src="@Url.Action("Globals", "Client")"></script>
<script src="@Url.Content("~/Scripts/main.js")"></script>
..., которая просто включаетвывод из / Client / Globals.И "main.js", в который мы теперь переместили остальную часть вашего скрипта:
main.js (статический):
$(document).ready(function () {
$.ajax({
url: GLOBALS.Urls.GetMessages,
dataType: 'html',
success: function (result) {
$('tbody').html(result);
}
});
});
Вы, конечно, можете использовать то же самоетакой подход, чтобы вывести несколько пользовательских / контекстных / видовых настроек прямо в вид.Для нескольких URL или данных подход data- * может быть лучше в зависимости от ваших вкусов.Я не фанат добавления тонн того, что в основном настраивается в атрибуты на каждой странице HTML.