Строка маски в 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;
}
}
}