Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions src/Components/Forms/src/EditContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public void NotifyValidationStateChanged()
/// <param name="fieldIdentifier">Identifies the field whose modification flag (if any) should be cleared.</param>
public void MarkAsUnmodified(in FieldIdentifier fieldIdentifier)
{
if (_fieldStates.TryGetValue(fieldIdentifier, out var state))
if (GetFieldState(fieldIdentifier) is { } state)
{
state.IsModified = false;
}
Expand Down Expand Up @@ -159,7 +159,7 @@ public IEnumerable<string> GetValidationMessages()
/// <returns>The current validation messages for the specified field.</returns>
public IEnumerable<string> GetValidationMessages(FieldIdentifier fieldIdentifier)
{
if (_fieldStates.TryGetValue(fieldIdentifier, out var state))
if (GetFieldState(fieldIdentifier) is { } state)
{
foreach (var message in state.GetValidationMessages())
{
Expand All @@ -183,9 +183,7 @@ public IEnumerable<string> GetValidationMessages(Expression<Func<object>> access
/// </summary>
/// <returns>True if the field has been modified; otherwise false.</returns>
public bool IsModified(in FieldIdentifier fieldIdentifier)
=> _fieldStates.TryGetValue(fieldIdentifier, out var state)
? state.IsModified
: false;
=> GetFieldState(fieldIdentifier)?.IsModified ?? false;

/// <summary>
/// Determines whether the specified fields in this <see cref="EditContext"/> has been modified.
Expand Down Expand Up @@ -222,12 +220,14 @@ public bool Validate()

internal FieldState? GetFieldState(in FieldIdentifier fieldIdentifier)
{
ValidateFieldIdentifier(fieldIdentifier);
_fieldStates.TryGetValue(fieldIdentifier, out var state);
return state;
}

internal FieldState GetOrAddFieldState(in FieldIdentifier fieldIdentifier)
{
ValidateFieldIdentifier(fieldIdentifier);
if (!_fieldStates.TryGetValue(fieldIdentifier, out var state))
{
state = new FieldState(fieldIdentifier);
Expand All @@ -236,4 +236,14 @@ internal FieldState GetOrAddFieldState(in FieldIdentifier fieldIdentifier)

return state;
}

private static void ValidateFieldIdentifier(in FieldIdentifier fieldIdentifier)
{
if (fieldIdentifier.Model is null || fieldIdentifier.FieldName is null)
{
throw new ArgumentException(
"The supplied FieldIdentifier is invalid. It must have a non-null Model and FieldName. This can happen when a component is not bound using @bind or the ValueExpression parameter is not supplied.",
nameof(fieldIdentifier));
}
}
}
10 changes: 10 additions & 0 deletions src/Components/Forms/test/EditContextTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,16 @@ public void RaisesEventWhenFieldIsChanged()
// Assert
Assert.True(didReceiveNotification);
}
[Fact]
public void NotifyFieldChanged_ThrowsForInvalidFieldIdentifier()
{
var editContext = new EditContext(new object());

var ex = Assert.Throws<ArgumentException>(() => editContext.NotifyFieldChanged(default));

Assert.Equal("fieldIdentifier", ex.ParamName);
Assert.StartsWith("The supplied FieldIdentifier is invalid.", ex.Message);
}

[Fact]
public void CanEnumerateValidationMessagesAcrossAllStoresForSingleField()
Expand Down
Loading