• Почему EF не хочет сохранять сущность?

    @dmitrytut
    Используй Bind().To().InRequestScope() вместо Bind().To().InSingletonScope().
    Ответ написан
    Комментировать
  • Как лучше работать с временными зонами (timezones) в веб-приложениях?

    @dmitrytut Автор вопроса
    В итоге выбрал 2-й вариант, т.е. timezone хранить в cookies.
    Ниже представлю реализацию на ASP.Net Web Api (сервер) + JQuery (клиент)

    Клиент (использовалась библиотека jquery.cookie):
    function setTimezoneCookie() {
    	var timezone_cookie = "tz";
    	//  Инвертируем смещение (см. документацию к getTimezoneOffset)
    	var timezone_offset = (new Date().getTimezoneOffset())*(-1);
    
    	//Если нет - создаем
    	if (!$.cookie(timezone_cookie)) {
    		// проверка поддержки куков браузером
    	    var isCookiesEnabled = 'isCookiesEnabled';
    		$.cookie(isCookiesEnabled, true);
    		if ($.cookie(isCookiesEnabled)) {
    			// удаляем тестовые куки
    		    $.cookie(isCookiesEnabled, null);
    			// записываем timezone
    			$.cookie(timezone_cookie, timezone_offset);
    		}
    	}
    	else {
    		// Если куки с timezone уже есть, но отличается, то записываем новое значение
    		var storedOffset = parseInt($.cookie(timezone_cookie));
    		var currentOffset = timezone_offset;
    		if (storedOffset !== currentOffset) {
    			$.cookie(timezone_cookie, timezone_offset);
    		}
    	}
    }


    Сервер:
    Создаем HttpMessageHandler для перехвата куки:
    public class TimezoneHandler : DelegatingHandler
        {
            static public string TimezoneToken = "tz";
    
            async protected override Task<HttpResponseMessage> SendAsync(
                HttpRequestMessage request, CancellationToken cancellationToken)
            {
                // Изначально, смещение относительно UTC нулевое
                int timezoneOffset = 0;
    
                // Получаем значение временной зоны из cookies
                var cookie = request.Headers.GetCookies(TimezoneToken).FirstOrDefault();
                if (cookie != null)
                {
                    try
                    {
                        timezoneOffset = Int32.Parse(cookie[TimezoneToken].Value);
                    }
                    catch (FormatException)
                    {
                        // Ошибка в формате временного смещения - выставляем в нулевое
                        timezoneOffset = 0;
                    }
                }
    
                // Сохраняем временное смещение в свойствах HTTP-запроса
                request.Properties[TimezoneToken] = timezoneOffset;
    
                // Продолжаем выполнение HTTP-запроса
                HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
    
                return response;
            }
        }


    Регистрируем обработчик в WebApiConfig.cs:
    public static void Register(HttpConfiguration config)
    {
    ...
         config.MessageHandlers.Add(new TimezoneHandler());
    ...
    }


    Используем в коде:
    ...
    int? tzOffset = Request.Properties[TimezoneHandler.TimezoneToken] as int?;
    ...
    Ответ написан
    Комментировать
  • ASP.NET Как получить html-код сайта, определяемый сервером, от клиента?

    @dmitrytut
    Вам нужно на клиенте загрузить html-код с помощью JQuery. Поскольку политики безопасности браузера в большинстве случаев заблокируют прямой запрос к стороннему ресурсу, то вам нужно включить в ваш клиентский код эту библиотеку:
    https://github.com/padolsey/jQuery-Plugins/blob/ma...
    Далее использовать ajax для получения html:
    function getHtml() {
             $.ajax({
               url: 'http://www.test.com',
               type: 'GET',
               success: function(res) {
                 var content = $(res.responseText).text();
                 alert(content);
               }
             });
           }


    После этого, полученный html можно отправить на сервер как угодно, например, с помощью того-же $.ajax.
    Ответ написан
    2 комментария
  • Как в ASP.NET Web Api передавать Decimal тип с различными разделителями ('.'\',')?

    @dmitrytut Автор вопроса
    В общем, кому интересно, в итоге написал JSON.Net конвертер, который заменяет запятую на точку и зарегистрировал его глобально (оказывается так можно) чтобы обрабатывались все decimal.
    Конвертер:
    public class DecimalFormatConverter: JsonConverter
      {
        public override bool CanConvert(Type objectType)
        {
            return (objectType == typeof(decimal) || objectType == typeof(decimal?));
        }
    
        public override void WriteJson(
          JsonWriter writer, 
          object value, 
          JsonSerializer serializer)
        {
            writer.WriteValue(value);
        }
    
        public override object ReadJson(
          JsonReader reader, 
          Type objectType, 
          object existingValue, 
          JsonSerializer serializer)
        {
          if (reader.Value != null)
          {
            try
            {
              string replacedValue = reader.Value.ToString().Replace(',', '.');
    
              return decimal.Parse(replacedValue, CultureInfo.InvariantCulture);
            }
            catch (Exception ex)
            { 
              throw new Exception(
                String.Format("Decimal coverting error. Message: {0}.", ex.Message));
            }
          }
          return null;
        }
      }


    И его глобальная регистрация в файле Global.asax.cs в методе Application_Start():
    ...
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new DecimalFormatConverter());
    ...


    Но все же, интересно послушать критику такого подхода и способы решения из разряда Best Practices, наверняка сталкивались?
    Ответ написан
    Комментировать
  • Как лучше предоставлять данные директиве AngularJS?

    @dmitrytut Автор вопроса
    Спасибо.
    Сейчас у меня как раз сделано так, что логика взаимодействия с сервером вынесена в отдельный сервис, а в директиву я его "инжектю".
    Сейчас, перечитав вопрос, понял, что задал не то, что хотел...
    Истинный вопрос не про логику взаимодействия с сервером, а про логику предоставления данных директиве вообще!!!
    В конкретном, частном случае данные получаются с сервера, т.е. вопрос:
    Как лучше - получать данные внутри директивы и использовать ее просто:
    <my-dir/>
    Или, все таки, оставить получение данных на откуп того, кто будет пользоваться директивой, а данные в директиву передавать через атрибуты:
    <my-dir data-my-text="myText" data-my-model="myModel"></my-dir>


    Извините, за неточность в постановке вопроса, вопрос отредактирован.
    Ответ написан
    Комментировать