λ°μ΄ν° κ²μ¦ λ©μμ§λ₯Ό μ§μνν λ λ§λ ν μλ¨μ΄ μμ΄, κ³ λ―Όλ€ ν λ² μ© ν΄λ³΄μ ¨μ κ²λλ€.
λ·λ·μ λ°μ΄ν° μ΄λ Έν μ΄μ μ μ¬μ©νλ λ°©λ²μ΄ μμ§λ§, μ¬κΈ°μλ λ κ°μ§ λ¬Έμ κ° μμ΅λλ€.
첫째λ‘, λΌμ΄λΈλ¬λ¦¬μμ μ 곡νλ μλ¬Έ λ©μμ§ ν
νλ¦Ώμ λ³κ²½ μ μ©νλ κ²μ΄ νλ€λ€λ κ²μ
λλ€.
μ΄λ₯Ό μν΄μλ μ λ§μ μ½λκ° νμν©λλ€. (λͺ λͺ μ€ν μμ€ νλ‘μ νΈ μκΈ°λ ν©λλ€λ§, λΆνΈν΄ 보μ¬μ μ¬μ©ν΄λ³΄μ§ μμμ΅λλ€.)
λμ§Έλ‘, 컀μ€ν resx νμΌμ μμ±νλ κ²½μ°, Key-Valueλ₯Ό λ¨Όμ κ³ λ―Όν΄μΌ ν΄μ, λ‘μ§ μ½λ λ³΄λ€ λΆλ΄μ΄ λ§μμ§ μ μμ΅λλ€.
λΈλ μ΄μ λ λ€νμ€λ½κ²λ EditForm μμκ° κ²μ¦ λ©μμ§λ‘ λμ μΈ λ¬Έμμ΄μ μ¬μ©ν μ μκ²λ μ§μν©λλ€.
μ΄λ₯Ό IStringLocalizer μ ν¨κ» μ¬μ©νλ©΄ λ³΄λ€ κ°νΈνκ² μ§μνλ Validation λ©μΈμ§λ₯Ό μμ±ν μ μμ΅λλ€.
@*MyComponent.razor*@
@implements IDisposable
@IStringLocalizer<AppTexts> Texts
<EditForm EditContext="_editContext" OnValidSubmit="Submit" FormName="WeekDaysSelection">
<div>
<label>
<InputCheckbox @bind-Value="Model!.HasMon" /> @Texts["μ"]
</label>
</div>
<div>
<label>
<InputCheckbox @bind-Value="Model!.HasTue" /> @Texts["ν"]
</label>
</div>
@* μλ΅ *@
<div>
<label>
<InputCheckbox @bind-Value="Model!.HasSun" /> @Texts["μΌ"]
</label>
</div>
<div>
<ValidationMessage For="() => Model!.Selecteds" />
</div>
<div>
<button type="submit">@Texts["νμΈ"]</button>
</div>
</EditForm>
@code {
[SupplyParameterFromForm]
public WeekDays? Model { get; set; }
private EditContext? _editContext;
private ValidationMessageStore? _messageStore;
protected override void OnInitialized()
{
Model ??= new();
_editContext = new(Model);
_editContext.OnValidationRequested += HandleValidationRequested;
_messageStore = new(_editContext);
}
// λ°μ΄ν° κ²μ¦ μμ² νΈλ€λ¬
private void HandleValidationRequested(object? sender,
ValidationRequestedEventArgs args)
{
_messageStore?.Clear();
var selected = Model!.Selecteds.Count();
if (selected < 1)
{
_messageStore?.Add(() => Model.Selecteds, Texts["νλ μ΄μ μ νν΄μΌ ν©λλ€."]);
}
else if (selected > 5)
{
_messageStore?.Add(() => Model.Selecteds, Texts["5κ° λ³΄λ€ λ§μ΄ μ ννλ©΄ μλ©λλ€."]);
}
}
private void Submit()
{
// λ°μ΄ν° κ²μ¦μ΄ μ±κ³΅νμ λ μ€νλλ μ½λ
}
public void Dispose()
{
if (_editContext is not null)
{
_editContext.OnValidationRequested -= HandleValidationRequested;
}
}
public class WeekDays
{
public bool HasSun { get; set; }
public bool HasMon { get; set; }
public bool HasTue { get; set; }
public bool HasWed { get; set; }
public bool HasThu { get; set; }
public bool HasFri { get; set; }
public bool HasSat { get; set; }
public IEnumerable<DayOfWeek> Selecteds
{
get
{
if (HasSun) yield return DayOfWeek.Sunday;
if (HasMon) yield return DayOfWeek.Monday;
if (HasTue) yield return DayOfWeek.Tuesday;
if (HasWed) yield return DayOfWeek.Wednesday;
if (HasThu) yield return DayOfWeek.Thursday;
if (HasFri) yield return DayOfWeek.Friday;
if (HasSat) yield return DayOfWeek.Saturday;
}
}
}
EditForm.EditContext
μ΄ κ°μ²΄λ Form μ ν΅ν΄ μ¬μ©μκ° λ°μ΄ν°λ₯Ό νΈμ§νλ μν©(Context)μ λνλ΄λλ°, μ μ©ν λ©ν μ 보λ₯Ό μ 곡ν©λλ€. .
μλ μ½λλ λ°μ΄ν° λͺ¨λΈλ‘ EditContext λ₯Ό μμ±νκ³ , λ©ν μ 보 μ€ κ΄μ¬ μλ λΆλΆ, μ¦, λ°μ΄ν° κ²μ¦ μμ² μ΄λ²€νΈλ₯Ό ꡬλ νλ μ½λμ λλ€.
protected override void OnInitialized()
{
Model ??= new();
_editContext = new(Model);
editContext.OnValidationRequested += HandleValidationRequested;
messageStore = new(editContext);
}
λ§μ§λ§ μ€μ, μμ±λ EditContextλ‘ ValidationMessageStore κ°μ²΄λ₯Ό μ΄κΈ°ννλλ°, μ΄λ κ² μ΄κΈ°νλ λ©μμ§ μ μ₯μ κ°μ²΄λ μλ μμκ° μ¬μ©ν©λλ€.
<div>
<ValidationMessage For="() => Model!.Selecteds" />
</div>
ValidationMessageStore κ°μ²΄μ ValidationMessage μμμ μ°κ΄μ±μ 맀μ§μ λλ€.
κ²μ¦ μ²λ¦¬ κ³Όμ
EditContext.OnValidationRequested μ΄λ²€νΈμ μ νλ EditForm μ΄ κ΄μ₯νλλ°, OnValidSubmit μ΄ null μ΄ μλ λ μ΄λ²€νΈ μ νλ₯Ό μμ²ν©λλ€.
<EditForm EditContext="_editContext" OnValidSubmit="Submit" ...
λ§μ½ μλμ κ°μ΄ μ€μ νλ©΄, μ΄λ²€νΈλ μ νλμ§ μμ΅λλ€.
<EditForm EditContext="_editContext" OnSubmit="Submit" ...
Form Dataκ° λμ°©νμ λ, EditForm μ΄ λ°μ΄ν°λ₯Ό κ²μ¦νλ μ λ°μ μΈ μ²λ¦¬ κ³Όμ μ μλμ κ°μ΅λλ€.
OnValidSubmit == null ? ( OnSubmit == null ? Do nothing : OnSubmit νΈμΆ)
: EditContext.EditContext.OnValidationRequested νΈμΆ
ValidationMessage μμκ° EditContext κ°μ²΄λ₯Ό CasCade λ°μ.
ValidationMessageStore μμ EditContextμ ν΄λΉνλ λ©μμ§λ₯Ό μ°Ύμ. => μλ κ²½μ°λ§, λ©μμ§ λ λλ§.
ValidationMessage μμλ ValidationMessageStore μμ λ©μμ§λ₯Ό μ°ΎκΈ° λλ¬Έμ, μλ‘μ΄ κ²μ¦ μμ² λλ§λ€, μ΄λ₯Ό λΉμμ£Όμ§ μμΌλ©΄, μ§λ λ² λ©μμ§ μ½λκ° λ³΄μ¬μ§κ² λ©λλ€.
// λ°μ΄ν° κ²μ¦ μμ² νΈλ€λ¬
private void HandleValidationRequested(object? sender,
ValidationRequestedEventArgs args)
{
_messageStore?.Clear();
μμ² νΈλ€λ¬μ μ€ν λ°νμ
μμ² νΈλ€λ¬μ μ€νμ λΈλ μ΄μ μ νΈμ€ν
λͺ¨λΈμ λ°λΌ λ¬λΌμ§λλ€.
Static SSR/Interactive Server μ κ²½μ° μλ²μμ, Interactive Webassembly μΈ κ²½μ° ν΄λΌμ΄μΈνΈμμ μ€νλ©λλ€.
Form Data - Model λ°μΈλ©
μ΄λ λΈλ μ΄μ κ° μ²λ¦¬ν©λλ€.
λΈλ μ΄μ λ νΈμ€ν
λͺ¨λΈμ λ°λΌ μλμ κ°μ΄ λͺ¨λΈμ μ½λμ μ λ¬ν©λλ€.
-
Static SSRμΈ κ²½μ°,
- Enhance Form μΈ κ²½μ°
blazor.web.js μ fetch μμ²μ ν΅ν΄, - μλ κ²½μ°
Html Form submissionμ ν΅ν΄
- Enhance Form μΈ κ²½μ°
-
Interactive Server μΈ κ²½μ°, μΉμμΌμ ν΅ν΄,
-
Interactive Webassembly μΈ κ²½μ°, wasm - js interop μ ν΅ν΄ μ λ¬ν©λλ€.
μ°Έκ³ λ‘, μμ£Ό κ°λ, λ°μΈλ©μ΄ μλλ κ²½μ°κ° μμ΅λλ€.
μ΄ κ²½μ°, λμ μλλ μλ¬ λ©μμ§λ§ 보μ¬μ§ λΏμ΄λΌ, μ λ μμΈμ μ°Ύμ§λ λͺ»νμ΅λλ€.
μ무리 λ΄λ, μ½λμ λ¬Έμ κ° μμ΄ λ³΄μΈλ€λ©΄, λΉμ£ΌμΌ μ€νλμ€λ₯Ό λͺ λ² μ΄κ³ λ«μΌλ©΄ ν΄κ²°μ΄ λ©λλ€.
μλ λλ λ¦΄λ¦¬μ€ λͺ¨λλ‘ λΉλν΄λ μλλ, κ·Έλ₯ VSλ₯Ό λκ³ λ«λ κ² μ’μ΅λλ€. λ λκΉμ§.
νμ΄λΌλ©΄, EditForm μ ν΅ν΄ ν λΉλλ νλΌλ―Έν°λ OnParametersSet 보λ€λ OnInitialized μμ ν λΉμ μ²λ¦¬νλ κ² κ·Έλλ§, λ°μνλ₯ μ μ€μ΄λ κ² κ°μ΅λλ€.
IStringLocalizer<T>
μ΄ κ°μ²΄λ T.resx νμΌμ μ°Ύκ³ , νμΌμ΄ μκ±°λ, μμ΄λ ν΄λΉ key κ° μ‘΄μ¬νμ§ μμΌλ©΄, key κ°μ λ°νν©λλ€.
μμ λ‘ μ€λͺ νλ©΄,
@IStringLocalizer<AppTexts> Texts
<EditForm EditContext="_editContext" OnValidSubmit="Submit" FormName="WeekDaysSelection">
<div>
<label>
<InputCheckbox @bind-Value="Model!.HasMon" /> @Texts["μ"]
</label>
...
IStringLocalizer<AppTexts>λ μλΉμ€ 컨ν μ΄λλ‘λΆν° μ£Όμ λ°κ³ , μ½λμμ Texts[βμβ] μ νΈμΆνλλ°,
AppTexts.resx νμΌμ΄ μκ±°λ, μμ΄λ, μ΄ νμΌμ key "μ"μ ν΄λΉνλ value κ° μμΌλ©΄, "μ"μ λ°ννλ€λ μλ―Έμ λλ€.
μ΄λ AppTexts.resx νμΌμ΄ μ‘΄μ¬νμ§ μμλ λ¨μ μλ―Έν©λλ€.
λ€λ§, μ리 μ§ν΄μ΄ νμΌμΈ AppTexts.cs νμΌμ μμ΄μΌ ν©λλ€.
public class AppTexts { }
IStringLocalizer<AppTexts> κ°μ²΄μ λͺ¨λ ν€λ₯Ό νκΈλ‘λ§ μ§μ νλ©΄, κ°μμ AppTexts.resx λ νκΈ μμ νμΌκ³Ό κ°κΈ° λλ¬Έμ, UIλ₯Ό νκΈλ‘ λΉ λ₯΄κ² μμ±ν μ μμ΅λλ€.
λμ€μ μλ¬Έμ΄ νμν κ²½μ°μλ§, AppTexts.en.resx νμΌμ μμ±νλ©΄ λ©λλ€.
λ€λ§, μ¬κΈ° μ κΈ° λΆμ°λ νκΈ μμμ μ°Ύλ κ² μμ΄ λ§μ΄ κ°λ μΌμ΄κΈ°λ ν©λλ€.