Строка маски в ViewModel C#

У меня есть представление, что тянет список всего в базе данных, и это прекрасно работает. Однако есть одна информация, которую я должен замаскировать, и что бы я ни пытался, я не могу ее замаскировать.

Я хочу замаскировать его 5 * (независимо от длины строки) и отобразить последние 4 цифры.

Любая идея о лучшем способе достичь этого с тем, что у меня есть?

Пример строки: "SD46346" && "ADFF3342422" && "56-AS4566S"

контроллер

    vm.Accounts = accounts
        .Select(s => new AdminViewModel.Account
        {
            Id= (s._ID.Length > 40 ? Encryptor.Decrypt(s._ID) : s._ID),
        }).ToList();
    return View(vm);

ViewModel

public List<Account> Accounts { get; set;}

public class Account
{
    public string Id { get; set; }
}

Вещи, которые я пробовал: Ошибка сервера в приложении '/xxxxx'. StartIndex не может быть меньше нуля. Имя параметра: startIndex -

public string DisplayID
{
    get
    {
        return string.Format("*****{0}", Id.Substring(Id.Length - 4));
    }
} 

ОБНОВИТЬ

Это был не мой код, это были старые данные, которые были потеряны в базе данных, которая имела только 2 символа.

2 ответа

Решение

Если вы только что заменили отображение, вы можете добавить дополнительное свойство, которое вы используете для отображения.

string ID {get;set;}

string DisplayID 
{
    get
    {
        return string.Format("*****{0}", ID.substring(ID.Length - 4))
    }
}

По вашей просьбе это может быть небольшим перебором. Но вот способ быстрого расширения, который делает это.

по умолчанию используется x как маскирующий символ, но его можно изменить с помощью необязательного символа

Просмотр модели

string ID {get;set;}

string DisplayID 
{
    get
    {
        ID.MaskAllButLast(4,'*');
    }
}

Метод расширения

   public static class Masking
{
    public static string MaskAllButLast(this string input, int charsToDisplay, char maskingChar = 'x')
    {
        int charsToMask = input.Length - charsToDisplay;
        return charsToMask > 0 ? $"{new string(maskingChar, charsToMask)}{input.Substring(charsToMask)}" : input;
    }
}

Это должно работать без ошибок и без ошибок для короткого идентификатора. Он также полностью покажет короткий идентификатор, так что есть компромисс.

Не уверен, что я понимаю строку (двойные кавычки и амперсанд), но вы должны иметь возможность изменять код по мере необходимости.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "SD46346\" && \"ADFF3342422\" && \"56-AS4566S";
            string pattern = @"\d{4}";  //exactly four digits in a row
            Match match = Regex.Match(input, pattern, RegexOptions.RightToLeft);

            string output = match.Value;
        }
    }
}
Другие вопросы по тегам