• Как должен быть путь для контроллера?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Если вы, как у вас написано, передаете название страны и города через путь в URL, то параметры метода Action для URL второго формата должен привязываться к переменной маршрутизации, примерно так:
    [HttpGet("{country}/{city}")]
    public IActionResult ActionMethod([FromRoute] String country, [FromRoute] String city) 
    {
      //... method code
    }

    [FromRoute] можно и не писать, если параметров запроса (то, что после '?' в URL) нет: привязка по умолчанию выберет следующим источником переменные маршрутизации.
    PS Можно обойтись одним методом действия (Action), если указать что city - параметр необязательный
    [HttpGet("{country}/{city?}")]
    public IActionResult ActionMethod([FromRoute] String country, [FromRoute] String? city) 
    {
     if(city==null) {
      //... method 1 code 
     }
     else {
      //... method 2 code 
     }
    }
    Ответ написан
    Комментировать
  • Как вернуть ссылку на уровень ниже url-пути?

    Isafu
    @Isafu
    Самое простое разбивать на массив через Split и возвращать по индексу, через Lenght - 1 и Lenght - 2
    Ответ написан
    4 комментария
  • Как пройтись циклом по результирующим данным функции?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Естественно не можете, потому что ServiceResult у вас IEnumerable не реализует (про это написано в сообщении об ошибке). А IEnumerable, по которому можно пройтись - это параметр-тип для ServiceResult, и до значения этого типа еще надо добраться.
    Разберитесь, что это у вас за обобщенный тип - ServiceResult (похоже, это из какой-то сторонней библиотеки), найдите в нем свойство типа T (или метод, возвращающий T) - который тип T в вашем случае - это IEnumerable - и пройдитесь циклом foreach по значению этого свойства (или результату, возвращенному методом).
    PS Если не найдете - дайте больше информации по используемым библиотекам (пакетам NuGet и т.п.), иначе придется вам ждать телепатов или ясновидящих, чтобы они эту информацию нам передали.
    Ответ написан
    Комментировать
  • Как обрезать url-строку?

    GavriKos
    @GavriKos
    Ну если вам надо просто отбросить все что после / последнего, то можно двумя вариантами:
    - split + join (его вроде нет в сишарпе, ну тогда обычная конкатенация)
    - substring + LastIndexOf
    Ответ написан
    Комментировать
  • Как решить проблему string.Format?

    @Voland69
    Если вызываемая сторону и вас устраивают пустые параметры в урле, то попробуйте так
    string.Format(GetAQuoteLink, culture, centre?.Id ?? string.Empty, location)

    А если при пустом centre надо именно скипнуть параметр, то я бы переписал следующим образом:
    1. собираем все параметры в словарик string, string
    2. делаем Select() в строку вида "key=value"
    3. делаем string.Join() с правильным разделителем (&)
    4. если строка не пуста, то через ? конкатенируем с урлом

    P.S. есть смысл для такого рассмотреть библиотеку готовую, в Asp.Net Core например QueryString из коробки умеет то что нужно.
    Ответ написан
    Комментировать
  • Как определить какой сейчас сезон и сколько прошло дней по сегодня?

    @Electron12121
    Вы можете использовать оператор switch для выбора правильного сезона в зависимости от значения переменной todaysSeason:
    ini
    var getTodaysDate = DateTime.Now;
    var todaysSeason = GetSeason(getTodaysDate);

    switch (todaysSeason)
    {
    case Season.Spring:
    daysPassed = getTodaysDate - springStarts;
    break;
    case Season.Summer:
    daysPassed = getTodaysDate - summerStarts;
    break;
    case Season.Autumn:
    daysPassed = getTodaysDate - autumnStarts;
    break;
    case Season.Winter:
    daysPassed = getTodaysDate - winterStarts;
    break;
    }
    Также вы можете использовать метод DateTime.ToLocalTime(), чтобы получить локальное время для текущей даты и времени. Это может быть полезно, если вы хотите определить сезон для определенной временной зоны.
    var getTodaysDate = DateTime.Now.ToLocalTime();
    var todaysSeason = GetSeason(getTodaysDate);
    Ответ написан
    Комментировать
  • Как заоверлоудить Join одного параметра?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    На самом деле тебе нужен string.Join(",", source)
    Ну либо тебе нужен вот такой екстеншен:
    public static class StringExtensions {
      public static string Join<T>(this IEnumerable<T> parts, string separator) => 
        tring.Join(separator, parts);
    }
    Ответ написан
    Комментировать
  • Как Dictionary отобразить в html-шаблоне?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Для вывода всех пар:
    {{#each dict}}
    <div>{{@key}}=>{{@value}}</div>
    {{/each}}


    Для вывода значения по какому-то заранее известному, предопределённому ключу:
    {{dict.[wellknown key]}}

    Модель, которую передаём в параметры:
    var args = new {dict = new Dictionary<string,string>()};
    var compiledTemplate = Handlebars.Compile(template);
    string templateOutput = compiledTemplate(args);
    Ответ написан
    Комментировать
  • Как пройтись несколько раз циклом?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Используй цикл while чтобы запрашивать новые данные, пока есть HasMore.
    А при помощи foreach занимайся перекладыванием.

    Что-то типа
    var allPaymentMethods = new List<PaymentMethod>();
    StripeList<PaymentMethod> paymentMethodsList;
    var options = new PaymentMethodListOptions
                {
                    Customer = "NUM",
                    Type = "card",
                    Limit = 100
                };
    do {
      paymentMethodsList = service.List(options)
      allPaymentMethods.AddRange(paymentMethodsList);
      var lastItem = allPaymentMethods.Last();
      options.StartingAfter = lastItem.Id;
    } while(paymentMethodsList.HasMore);
    Ответ написан
    Комментировать
  • Как пройтись несколько раз циклом?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Обычно такой подход пагинации выглядит как
    while (paymentMethods.HasMore)
    {
         var lastEntity = paymentMethods.Data.LastOrDefault();
         entities.Add(lastEntity);
         options.StartingAfter = lastEntity.Id;
    }
    Ответ написан
    Комментировать
  • Как с одного массива данных внести данные из другого?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Если я всё правильно понял, то вот:

    Исходные данные:
    FirstReportInvoiceDal[] firstReportInvoice =
    {
        new () { Id = 1, Number = "" },
        new () { Id = 2, Number = "" },
        new () { Id = 3, Number = "" },
        new () { Id = 4, Number = "" },
        new () { Id = 5, Number = "" },
    };
    SecondReportInvoiceDal[] secondReportInvoice =
    {
        new () { FirstReportId = 1, Number = "1111N" },
        new () { FirstReportId = 2, Number = "2222N" },
        new () { FirstReportId = 3, Number = "3333N" },
        new () { FirstReportId = 4, Number = "4444N" },
        new () { FirstReportId = 5, Number = "5555N" },
    };


    Вывод:
    Id: 1, Number: 1111N
    Id: 2, Number: 2222N
    Id: 3, Number: 3333N
    Id: 4, Number: 4444N
    Id: 5, Number: 5555N


    namespace ConsoleApp;
    
    class Program
    {
        public static void Main(string[] args)
        {
            FirstReportInvoiceDal[] firstReportInvoice =
            {
                new () { Id = 1, Number = "" },
                new () { Id = 2, Number = "" },
                new () { Id = 3, Number = "" },
                new () { Id = 4, Number = "" },
                new () { Id = 5, Number = "" },
            };
            SecondReportInvoiceDal[] secondReportInvoice =
            {
                new () { FirstReportId = 1, Number = "1111N" },
                new () { FirstReportId = 2, Number = "2222N" },
                new () { FirstReportId = 3, Number = "3333N" },
                new () { FirstReportId = 4, Number = "4444N" },
                new () { FirstReportId = 5, Number = "5555N" },
            };
    
            ReportRow[] rows = CreateReportRows(firstReportInvoice, secondReportInvoice);
            Display(rows);
        }
    
        private static void Display(IEnumerable<ReportRow> rows)
        {
            foreach (ReportRow row in rows)
            {
                Console.WriteLine(row);
            }
        }
    
        static ReportRow[] CreateReportRows(FirstReportInvoiceDal[] firstReportInvoice,
            SecondReportInvoiceDal[] secondReportInvoice)
        {
            // Для быстрого поиска делаем словарь с ключом SecondReportInvoiceDal.FirstReportId,
            // который соответствует ключу FirstReportInvoiceDal.Id.
            var secondReportSet = secondReportInvoice.ToDictionary(x => x.FirstReportId);
    
            // Для каждого firstReportInvoice сделать трансформацию (LINQ метод Select)
            return firstReportInvoice.Select(x =>
            {
                var row = new ReportRow
                {
                    Id = x.Id,
                    Number = secondReportSet[x.Id].Number
                };
                return row;
                // Вызываем ToArray, чтобы запустилось выполнение трансформации в методе Select.
                // И чтобы в принципе мы вернули данные, а не итератор.
            }).ToArray();
        }
    }
    
    class FirstReportInvoiceDal
    {
        public int Id { get; init; }
    
        public string Number { get; init; }
    }
    
    class SecondReportInvoiceDal
    {
        public int FirstReportId { get; init; }
    
        public string Number { get; init; }
    }
    
    class ReportRow
    {
        public int Id { get; init; }
    
        public string Number { get; init; }
    
        public override string ToString()
        {
            return $"Id: {Id}, Number: {Number}";
        }
    }
    Ответ написан
    1 комментарий
  • Как сделать проверку на null?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Вообще хз, как ты не додумался до самого простого - через if:
    string name;
    if(entity.Name == null)
    {
      name = "Name";
    }
    else
    {
      name = entity.Name;
    }
    DataModel dataModel = new DataModel()
    {
      Id = entity.Id,
      Name = name
    };
    // ...

    Но вообще есть вот такой синтаксис:
    new DataModel
    {
      Id = entity.Id,
      Name = entity?.Name ?? "Name"
    }

    Если нужно ещё обрабатывать пустоту, то самый короткий вариант будет как у freeExec
    Вот ссылки на документацию:
    string.IsNullOrEmpty: https://docs.microsoft.com/ru-ru/dotnet/api/system...
    Про ??: https://docs.microsoft.com/en-us/dotnet/csharp/lan...
    Про ?.: https://docs.microsoft.com/en-us/dotnet/csharp/lan...
    Ответ написан
    Комментировать
  • Как сделать проверку на null?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Name = string.IsNullOrEmpty(entity.Name) ? "Name" : entity.Name;
    Ответ написан
    Комментировать
  • Как вернуть правильный результат?

    В данный момент код из вопроса можно сократить до двух строк:

    private static IEnumerable<UserReportRow> CreateReportRows(UserReportItemDal[] source, IEnumerable<GetIdentityUserReportResponse> identityData)
    {
           var result = new List<UserReportRow>();
           return result;
    }


    Что, кроме пустого значения оно должно вернуть? Ведь в возвращаемую переменную никогда и ничего не добавляется
    Ответ написан
    Комментировать
  • Как отправить POST запрос?

    @rPman
    а почему ждешь именно 201 статус?
    раз есть отклик в консоли значит fetch отработало, смотри код сервера, пропиши там отладочной информации
    Ответ написан
    2 комментария
  • Как отработают throw?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Здесь никак не отработают, тк блок try пуст.

    Но если бы что-то было, то:
    При выпадении CustomException исключение было бы подавлено.
    При выпадении любого другого - оно было бы проброшено дальше без изменений.
    До этих строк выполнение бы не дошло. О чём кстати любая IDE говорит
    throw ex;
    throw new MyEx(ex);

    Ну и гарантированно бы ещё выполнился блок finally после отработки всех catch-ей, но перед падением.
    61b9e108af4d3560067099.png
    Ответ написан
    Комментировать
  • Как создать скрипт для заполнения таблицы временных интервалов?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Соответствующие столбцы имеют тип TIME.
    DECLARE @I INT = 0
    WHILE @I < 24 BEGIN
      INSERT [TimeSlot] ([Start Time], [End Time]) 
        VALUES ( CAST( DATEADD( hh, @I, 0 ) AS TIME ),  CAST( DATEADD( hh, @I + 1, 0 ) AS TIME ))
      SET @I = @I + 1
    END
    Ответ написан
    Комментировать
  • Как уведомить подписанных пользователь об изменении сайта?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    создайте 2 таблички

    GameNotification
    id - guid
    name - nvarchar(100)
    template - nvarchar(MAX)
    start - datetime
    end - datetime

    NotifiedUser
    GameNotificationId - guid
    UserId - guid -- GameNotificationId - UserId Составной ключ
    notified - bit
    start - dateTime
    end - datetime
    retryCount - byte
    chanel - byte

    В коде создаете нотификацию в таблице GameNotification
    После создаете пачку записей в NotifiedUser, какой то фоновый процесс их распространяет ставя статус отправки и отправляя по нужному каналу который человек указал (например в почту или на смс)
    Ответ написан
    Комментировать
  • Как уведомить подписанных пользователь об изменении сайта?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Добавить 2 поля "время изменения" и "время уведомления". Если "время изменения" больше чем "время уведомления", то рассылать уведомление и обновлять время.
    Ответ написан
    2 комментария
  • Как изменить наименование параметра?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    [HttpDelete]
    public async Task<IActionResult> Delete([FromQuery(Name="id")] int[] ids) {
      //...
    }
    Ответ написан
    Комментировать