Лучший способ управлять Magic Strings во внешнем JS-файле JavaScript

Если T4MVC не расширяется для внешнего файла JavaScript, я хотел бы найти лучший способ управления «волшебными строками», такими как значение контроллера/действия в методе JQuery .load().

Я хочу свести к минимуму риск изменения Действия, чтобы спровоцировать ошибку в приложении. Я знаю, что могу скомпилировать представления с помощью Visual Studio, чтобы найти ошибки на стороне клиента, но не во внешних файлах JS.

Я нашел некоторые решения, такие как включение представления в качестве типа файла javascript, чтобы я мог использовать T4MVC и обнаруживать ошибки компиляции представлений, но этот подход делает ненужным запрос сервера, и если бы это был JS, он был бы кэширован на стороне клиента.

Я думаю о постоянном файле JS или, в пределе, о постоянном файле просмотра с методом параметров T4MVC.

Любая лучшая идея?

Я оставляю здесь образец:

<script type="text/javascript">
$(function () {
    $('#Category_Id')
        .cascade(
        {
            url: '@Url.Action(MVC.Ad.ListCategoryTypeByCategory())',
            paramName: '@MVC.Ad.ListCategoryTypeByCategoryParams.categoryId',
            firstOption: '@HeelpResources.DropdownlistCategoryTypeFirstRecord',
            childSelect: $('#CategoryType_Id')
        })
        .cascade(
        {
            url: '@Url.Action(MVC.Ad.ListMakeByCategory())',
            paramName: '@MVC.Ad.ListMakeByCategoryParams.categoryId',
            firstOption: '@HeelpResources.DropdownlistMakeFirstRecord',
            childSelect: $('#Make_Id')
        });

    $('#Make_Id').cascade({
        url: '@Url.Action(MVC.Ad.ListModelByMake())',
        paramName: '@MVC.Ad.ListModelByMakeParams.makeId',
        firstOption: '@HeelpResources.DropdownlistModelFirstRecord',
        childSelect: $('#Model_Id')
    });
});
</script>

Как я могу избежать «Волшебных строк», если я хочу поместить этот код во внешний файл JS?

Спасибо.


person Patrick    schedule 30.12.2012    source источник
comment
Не могли бы вы включить примеры кода, чтобы было понятнее, чего вы пытаетесь достичь?   -  person David Ebbo    schedule 31.12.2012
comment
Привет, я только что поставил образец, чтобы объяснить, чего я хочу достичь. Спасибо.   -  person Patrick    schedule 31.12.2012


Ответы (3)


Я знаю, что вы уже пробовали это, но если вы хотите использовать T4MVC, я думаю, что возврат JS из файла .cshtml на стороне сервера, вероятно, будет вашим лучшим выбором. Обратите внимание, что это не означает, что он не будет кэшироваться на стороне клиента (если вы правильно поняли заголовки). На самом деле, с точки зрения клиента, возврат чистого JS-файла и возврат файла, полученного из .cshtml, на самом деле неотличимы. В любом случае, он возвращает JS.

person David Ebbo    schedule 31.12.2012

Я думаю, что метод, который вы используете, в порядке, это то, что я использую. На самом деле это не волшебные строки, потому что вы используете генерацию URL-адресов на основе маршрута, и вам никогда не придется беспокоиться об устаревании URL-адресов в javascript.

Другой подход может заключаться в использовании действия контроллера, которое возвращает JsonResult:

    public JsonResult GetConcentrationsMap() {
        var magicStrings = _magicStringsService.GetAll().Select(c => new { Name= c.Name, Url = c.Url });

        return Json(new { urls = magicStrings }, JsonRequestBehavior.AllowGet);
    }

Это будет кэшироваться на клиенте, но, как сказал Дэвид Эббо, вы можете добиться этого и с помощью .cshtml. Я думаю, что это больше проблем, потому что вам все равно нужно сообщать своему коду javascript путь к ресурсу .js или json, который имеет волшебные строки.

person Giscard Biamby    schedule 31.12.2012
comment
Пример, который я привел, работает только внутри файла cshtml и невозможен во внешнем файле JS. - person Patrick; 02.01.2013

Вы можете использовать JavaScriptModel ( http://jsm.codeplex.com). Если вам нужны эти «волшебные строки» глобально, вам следует подумать о написании фильтра и добавить их туда.

Вот пример того, как написать фильтр с помощью JavaScriptModel:

http://jsm.codeplex.com/wikipage?title=Use%20JavaScriptModel%20in%20a%20global%20filter&referringTitle=Documentation

person acuntex    schedule 10.01.2013
comment
Есть ли простой способ включить методы T4MVC с помощью этого объекта? - person Patrick; 11.01.2013