I have a Blazor Wasm app that I use with an ASP.Net Core API.
I have one page with a form that I use Blazors built in validation with (data annotations and so on).
However now I have added a new feature and I don't know how to solve the validation any more.
The nu feature is that the user can choose to either choose a value in a dropdown menu (this has been there from start and is Required) or click a button and enter some values. If the user clicks the button and enter the values needed the dropdown is no longer required.
I have no idea on how to solve this conditional validation. I have tried to read MS documentation but they don´t really cover this and other googling has not help either.

For other features on the same Form I use EditContext for the EditForm element instead of a model.
If the user clicks the button and fills in the form correctly an otherwise empty Object is instantiated
Do anyone have a solution for this?
The model used in the EditForm is this:
public class NewJobDTO
{
[Required(ErrorMessage = "A hash file must be added")]
public string HashFileName { get; set; }
public string? JobName { get; set; }
public string HashFileContent { get; set; }
[Required]
[Range(0, 99999)]
public int HashType { get; set; }
// [Required(ErrorMessage = "Please select a Dictionary")]
// [Range(1, 20, ErrorMessage = "Please select a Dictionary")]
public int Dictionary { get; set; }
[Required(ErrorMessage = "Please select a Rule")]
[Range(1, 2, ErrorMessage = "Please select a Rule")]
public int Rule { get; set; }
[Required]
[EmailAddress]
[Display(Name = "Email address")]
public string Owner { get; set; }
[Required(ErrorMessage = "A public gpg key file must be added")]
public string KeyFileName { get; set; }
public string KeyFileContent { get; set; }
}
Parts of the form:
<EditForm method="post" OnValidSubmit="Submit" EditContext="editContext" FormName="AddJob" Enhance>
<div class="row">
<div class="form-floating mb-2 col">
<InputSelect id="dictionary" class="form-select" aria-label="Dictionary select"
@bind-Value="newJob!.Dictionary">
<option value="0">Select dictionary to use</option>
@if(wordlists.Count != 0)
{
@foreach (var dict in wordlists)
{
<option value="@dict.Id">@dict.Name (@GetSize(dict.Size))</option>
}
}
</InputSelect>
<label for="dictionary">Dictionary*</label>
@if(newJob.Dictionary != 0)
{
<small>@wordlists.Where(w => w.Id == newJob.Dictionary).First().Description</small>
}
<ValidationMessage For="() => newJob.Dictionary" class="text-danger" />
</div>
<div class="col">
<button class="btn btn-secondary" type="button" @onclick="AddCewlConfig">Use Cewl</button>
</div>
</div>
<button class="btn btn-primary" type="submit" disabled="@formInvalid">Submit</button>
</EditForm>
When clicking on Use Cewl button this function is called:
private async void AddCewlConfig()
{
var parameters = new Dictionary<string, Object>();
parameters.Add("SaveCewl", new EventCallbackFactory().Create<CewlData>(this, async (CewlData result) =>
{
await modal.HideAsync();
if(result != null)
{
cewl = result;
}
}));
await modal.ShowAsync<AddCewlData>(title: "Add CeWL data", parameters: parameters);
}