Установка URL-адреса ajax для jQuery в файле JS с использованием ASP.NET MVC

Ваш файл является текстовым файлом, поэтому вы должны открыть его для чтения текста:

fid=fopen('c:\\input.txt','rt');

Затем для чтения я нахожу TEXTSCAN более мощным, чем FREAD / FSCANF (различия между ними

data = textscan(f, '%f')

возвращает массив ячеек. Вы можете получить содержимое с помощью

>> data{1}

ans =

       2
       4
       8
      16
      32
      64
     128
     256
     512
    1024
    2048
    4096
    8192

TEXTREAD проще в использовании, чем TEXTSCAN , но согласно документации теперь устарела.

21
задан Schotime 18 December 2008 в 01:40
поделиться

3 ответа

Этот способ полностью использует маршрутизацию MVC, поэтому вы можете в полной мере использовать преимущества инфраструктуры MVC. На основе ответа Стусмита.

Здесь у меня есть действие в ApplicationController для динамического javascript для этого URL:

 /application/js

Я включаю сюда статические файлы, потому что мне нужно загрузить только один главный файл javascript. Вы можете выбрать просто возврат динамического материала, если хотите:

     /// <summary>
    /// Renders out javascript
    /// </summary>
    /// <returns></returns>
    [OutputCache(CacheProfile = "Script")]
    [ActionName("js")]
    public ContentResult RenderJavascript()
    {
        StringBuilder js = new StringBuilder();

        // load all my static javascript files                    
        js.AppendLine(IO.File.ReadAllText(Request.MapPath("~/Scripts/rr/cart.js")));
        js.AppendLine(";");

        // dynamic javascript for lookup tables
        js.AppendLine(GetLookupTables());
        js.AppendLine(";");

        return new ContentResult()
        {
            Content = js.ToString(),
            ContentType = "application/x-javascript"
        };
    }

Это вспомогательная функция, которая создает нашу таблицу поиска. Просто добавьте строку для каждого RouteUrl, который вы хотите использовать.

    [NonAction]
    private string GetLookupTables() 
    {
        StringBuilder js = new StringBuilder();

        // list of keys that correspond to route URLS
        var urls = new[] {
            new { key = "updateCart", url = Url.RouteUrl("cart-route", new { action = "updatecart" }) },
            new { key = "removeItem", url = Url.RouteUrl("cart-route", new { action = "removeitem" }) }
        };

        // lookup table function
        js.AppendLine("// URL Lookuptable");
        js.AppendLine("$.url=function(url) {");
        js.AppendLine("var lookupTable = " + new JavaScriptSerializer().Serialize(urls.ToDictionary(x=>x.key, x=>x.url)) + ";");
        js.AppendLine("return lookupTable[url];");
        js.AppendLine("}");

        return js.ToString();
    }

Это генерирует следующий динамический javascript, который по сути представляет собой просто таблицу поиска от произвольного ключа к URL-адресу, который мне нужен для моего метода действия:

// URL Lookuptable
$.url=function(url) {
var lookupTable = {"updateCart":"/rrmvc/store/cart/updatecart","removeItem":"/rrmvc/store/cart/removeitem"};
return lookupTable[url];
}

В корзине. js у меня может быть такая функция. Обратите внимание, что параметр url взят из справочной таблицы:

 var RRStore = {};
 RRStore.updateCart = function(sku, qty) {

    $.ajax({

        type: "POST",
        url: $.url("updateCart"),
        data: "sku=" + sku + "&qty=" + qty,
        dataType: "json"

        // beforeSend: function (){},
        // success: function (){},
        // error: function (){},
        // complete: function (){},
    });

    return false;

};

Я могу вызвать его из любого места, просто:

 RRStore.updateCart(1001, 5);

Это был единственный способ, который я мог придумать и который позволил бы мне использовать Маршрутизация чистым способом. Динамическое создание URL-адресов в javascript неприятно и сложно протестировать. Типы тестирования можно добавить где-нибудь здесь, чтобы упростить тестирование.

19
ответ дан 29 November 2019 в 06:36
поделиться

Обернуть вызов AJAX в функцию, которая принимает URL (и любые другие данные) в качестве параметра (ов) и возвращает ответ. Затем, по вашему мнению, вызовите функцию вместо прямого вызова AJAX.

function doAjax( url, data, elem, callback )
{
    return $.ajax({
        url: url,
        data: { ajax: data },
        cache: false,
        success: function(response) { callback(response, elem, xhr); }
    });
}

...

<input type='button' value='Go get it' onclick='doAjax( <%= Url.Action ...

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

6
ответ дан tvanfosson 18 December 2008 в 01:40
поделиться

Вот еще один способ:

На главной странице включите область для встроенных сценариев:

<head>
  ...
  <asp:ContentPlaceHolder runat="server" ID="_inlineScripts" />
  ...
</head>

Затем в Page_Load создайте служебную функцию:

protected void Page_Load( object sender, EventArgs e )
{
  AddInlineScript( string.Format( "$.url=function(url){{return '{0}'+url;}}", GetBaseUri() ) );
  ...
}

private Uri GetBaseUri()
{
  var requestUrl = Request.Url.AbsoluteUri;
  var i = requestUrl.IndexOf( request.Path );

  return new Uri( requestUrl.Substring( 0, i ) );
}

private void AddInlineScript( string content )
{
  var script = new HtmlGenericControl( "script" );

  script.Attributes.Add( "type", "text/javascript" );
  script.InnerHtml = content;

  _inlineScripts.Controls.Add( script );
}

Теперь вы можете использовать эту функцию в вашем AJAX:

$.ajax({
  url: $.url('path/to/my-handler'),
  ...
});
-1
ответ дан stusmith 18 December 2008 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: