The TextPrompt prompts users to enter text input with validation, default values, and secret input masking.
When to Use
Use TextPrompt when you need to collect user input from the console. Common scenarios:
- Free-form text input: Collecting names, email addresses, or any text data
- Numeric input: Getting ages, quantities, or measurements with automatic type conversion
- Secure input: Requesting passwords or API keys with masked display
- Validated input: Ensuring input meets specific requirements before accepting it
For selecting from a predefined list of options, use SelectionPrompt instead, which provides a better user experience with arrow key navigation.
Caution
Text prompts are not thread safe. Using them together with other interactive components such as progress displays, status displays, or other prompts is not supported.
Basic Usage
Use AnsiConsole.Ask<T>() for the simplest way to prompt for user input.
var name = AnsiConsole.Ask<string>("What's your [green]name[/]?");
AnsiConsole.MarkupLine($"Hello, [blue]{name}[/]!");
Default Values
Using Ask with Default
You can provide a default value that users can accept by pressing Enter.
var name = AnsiConsole.Ask("What's your [green]name[/]?", "Anonymous");
AnsiConsole.MarkupLine($"Hello, [blue]{name}[/]!");
Configuring Default Display
Use DefaultValue() to set a default and control whether it's shown to the user.
var name = new TextPrompt<string>("What's your [green]name[/]?")
.DefaultValue("Anonymous")
.ShowDefaultValue();
var result = AnsiConsole.Prompt(name);
AnsiConsole.MarkupLine($"Hello, [blue]{result}[/]!");
Type Conversion
TextPrompt automatically converts input to your target type using built-in type converters.
var age = AnsiConsole.Ask<int>("What's your [green]age[/]?");
var height = AnsiConsole.Ask<decimal>("What's your [green]height[/] in meters?");
AnsiConsole.MarkupLine($"You are [blue]{age}[/] years old and [blue]{height}m[/] tall.");
This works with any type that has a TypeConverter, including int, decimal, DateTime, Guid, and custom types.
Direct TextPrompt Usage
For more control over prompt behavior, create a TextPrompt<T> instance directly instead of using Ask().
var prompt = new TextPrompt<string>("What's your [green]name[/]?");
var name = AnsiConsole.Prompt(prompt);
AnsiConsole.MarkupLine($"Hello, [blue]{name}[/]!");
Secret Input
Password Masking
Use Secret() to mask sensitive input with asterisks by default.
var password = new TextPrompt<string>("Enter your [green]password[/]:")
.Secret();
var result = AnsiConsole.Prompt(password);
AnsiConsole.MarkupLine($"Password length: [blue]{result.Length}[/] characters");
Custom Mask Characters
Specify a custom mask character or use null to completely hide input.
var pin = new TextPrompt<string>("Enter your [green]PIN[/]:")
.Secret('#');
var invisible = new TextPrompt<string>("Enter [green]secret code[/]:")
.Secret(null);
var pinResult = AnsiConsole.Prompt(pin);
var codeResult = AnsiConsole.Prompt(invisible);
AnsiConsole.MarkupLine($"PIN entered (length: [blue]{pinResult.Length}[/])");
AnsiConsole.MarkupLine($"Code entered (length: [blue]{codeResult.Length}[/])");
Validation
Simple Validation
Use Validate() with a boolean function to check if input is acceptable.
var email = new TextPrompt<string>("What's your [green]email[/]?")
.Validate(input =>
input.Contains("@") && input.Contains("."),
"[red]Please enter a valid email address[/]");
var result = AnsiConsole.Prompt(email);
AnsiConsole.MarkupLine($"Email: [blue]{result}[/]");
Rich Validation
For more complex validation with custom error messages, use ValidationResult.
var age = new TextPrompt<int>("What's your [green]age[/]?")
.Validate(age =>
{
if (age < 0)
{
return ValidationResult.Error("[red]Age cannot be negative[/]");
}
if (age > 120)
{
return ValidationResult.Error("[red]Please enter a realistic age[/]");
}
if (age < 18)
{
return ValidationResult.Error("[yellow]You must be 18 or older[/]");
}
return ValidationResult.Success();
});
var result = AnsiConsole.Prompt(age);
AnsiConsole.MarkupLine($"Age: [blue]{result}[/]");
Restricting to Choices
Showing Choices
Use AddChoices() to restrict input to specific values, displayed as options to the user.
var color = new TextPrompt<string>("What's your favorite [green]color[/]?")
.AddChoice("red")
.AddChoice("green")
.AddChoice("blue")
.AddChoice("yellow")
.ShowChoices();
var result = AnsiConsole.Prompt(color);
AnsiConsole.MarkupLine($"You chose: [blue]{result}[/]");
This is useful for limited options where users can type their choice. For better UX with many options, use SelectionPrompt instead.
Hidden Choices
Use HideChoices() when you want to validate against specific values without revealing them.
var secretWord = new TextPrompt<string>("Enter the [green]secret word[/]:")
.AddChoice("opensesame")
.AddChoice("abracadabra")
.AddChoice("alakazam")
.HideChoices();
var result = AnsiConsole.Prompt(secretWord);
AnsiConsole.MarkupLine($"Correct! The word was: [blue]{result}[/]");
Optional Input
Use AllowEmpty() to make input optional, allowing users to press Enter without typing anything.
var nickname = new TextPrompt<string>("Enter your [green]nickname[/] (optional):")
.AllowEmpty();
var result = AnsiConsole.Prompt(nickname);
if (string.IsNullOrWhiteSpace(result))
{
AnsiConsole.MarkupLine("[yellow]No nickname provided[/]");
}
else
{
AnsiConsole.MarkupLine($"Nickname: [blue]{result}[/]");
}
Styling
Customize the appearance of your prompts with different colors for the prompt text, default values, and choices.
var city = new TextPrompt<string>("What [yellow]city[/] do you live in?")
.PromptStyle(new Style(Color.Yellow))
.DefaultValue("London")
.DefaultValueStyle(new Style(Color.Green, decoration: Decoration.Italic))
.AddChoice("London")
.AddChoice("New York")
.AddChoice("Tokyo")
.AddChoice("Paris")
.ChoicesStyle(new Style(Color.Cyan));
var result = AnsiConsole.Prompt(city);
AnsiConsole.MarkupLine($"City: [blue]{result}[/]");
Custom Converters
Use WithConverter() to control how choices are displayed to users while keeping their underlying values.
var priority = new TextPrompt<int>("Select [green]priority[/] level:")
.AddChoice(1)
.AddChoice(2)
.AddChoice(3)
.AddChoice(4)
.AddChoice(5)
.WithConverter(level => level switch
{
1 => "Critical",
2 => "High",
3 => "Medium",
4 => "Low",
5 => "Trivial",
_ => level.ToString()
});
var result = AnsiConsole.Prompt(priority);
AnsiConsole.MarkupLine($"Priority level: [blue]{result}[/]");
See Also
- Prompt for User Input - Step-by-step guide
- Asking User Questions - Learn prompts basics
- SelectionPrompt - Choose from predefined options
- Test Console Output - Test prompts in CI
API Reference
Represents a prompt.
Constructors
TextPrompt`1(string prompt, StringComparer comparer)Initializes a new instance of the class.
Parameters:
prompt (string)comparer (StringComparer)Properties
AllowEmpty
: boolGets or sets a value indicating whether or not an empty result is valid.
Choices
: List<T>Gets the list of choices.
ChoicesStyle
: StyleGets or sets the style in which the list of choices is displayed. Defaults to blue when .
Converter
: Func<T, string>Gets or sets the converter to get the display string for a choice. By default the corresponding is used.
Culture
: CultureInfoGets or sets the culture to use when converting input to object.
DefaultValueStyle
: StyleGets or sets the style in which the default value is displayed. Defaults to green when .
InvalidChoiceMessage
: stringGets or sets the message for invalid choices.
IsSecret
: boolGets or sets a value indicating whether input should be hidden in the console.
Mask
: Nullable<Char>Gets or sets the character to use while masking a secret prompt.
PromptStyle
: StyleGets or sets the prompt style.
ShowChoices
: boolGets or sets a value indicating whether or not choices should be shown.
ShowDefaultValue
: boolGets or sets a value indicating whether or not default values should be shown.
ValidationErrorMessage
: stringGets or sets the validation error message.
Validator
: Func<T, ValidationResult>Gets or sets the validator.
Methods
T Show(IAnsiConsole console)Shows the prompt and requests input from the user.
Parameters:
console (IAnsiConsole)Returns:
The user input converted to the expected type.
Task<T> ShowAsync(IAnsiConsole console, CancellationToken cancellationToken)Parameters:
console (IAnsiConsole)cancellationToken (CancellationToken)