Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
40 changes: 32 additions & 8 deletions src/BootstrapBlazor/Components/Table/Table.razor
Original file line number Diff line number Diff line change
Expand Up @@ -787,18 +787,42 @@
{
@RenderRowExtendButtons(item)
}
@if (RowContentTemplate != null)
{
var columns = GetVisibleColumns();
@RowContentTemplate(new(item, columns, ActiveRenderMode))
@{
var isInCellEditRow = InCellMode && SelectedRows.FirstOrDefault() == item;
}
else
@if (isInCellEditRow)
{
@RenderContentRow(item)
<ValidateForm @ref="_inCellValidateForm" Model="EditModel" IsFormless="true">
@if (RowContentTemplate != null)
{
var columns = GetVisibleColumns();
@RowContentTemplate(new(item, columns, ActiveRenderMode))
}
else
{
@RenderContentRow(item)
}
@if (ShowExtendButtons && !IsExtendButtonsInRowHeader)
{
@RenderRowExtendButtons(item)
}
</ValidateForm>
}
@if (ShowExtendButtons && !IsExtendButtonsInRowHeader)
else
{
@RenderRowExtendButtons(item)
@if (RowContentTemplate != null)
{
var columns = GetVisibleColumns();
@RowContentTemplate(new(item, columns, ActiveRenderMode))
}
else
{
@RenderContentRow(item)
}
@if (ShowExtendButtons && !IsExtendButtonsInRowHeader)
{
@RenderRowExtendButtons(item)
}
}
</DynamicElement>;

Expand Down
8 changes: 7 additions & 1 deletion src/BootstrapBlazor/Components/Table/Table.razor.Edit.cs
Original file line number Diff line number Diff line change
Expand Up @@ -703,7 +703,13 @@ private async Task ClickEditButton(TItem item)

private async Task ClickUpdateButtonCallback()
{
var context = new EditContext(EditModel);
// 验证 InCell 模式下的表单
if (_inCellValidateForm != null && !_inCellValidateForm.Validate())
{
return;
}

var context = _inCellValidateForm?.GetEditContext() ?? new EditContext(EditModel);
await SaveAsync(context, AddInCell ? ItemChangedType.Add : ItemChangedType.Update);
}

Expand Down
5 changes: 5 additions & 0 deletions src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,11 @@ private bool GetColumnsListState(ColumnVisibleItem item)

private bool InCellMode => AddInCell || EditInCell;

/// <summary>
/// 获得 InCell 模式下的 ValidateForm 实例
/// </summary>
private ValidateForm? _inCellValidateForm;

/// <summary>
/// 新建按钮方法
/// </summary>
Expand Down
2 changes: 1 addition & 1 deletion src/BootstrapBlazor/Components/Table/Table.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1501,7 +1501,7 @@ RenderFragment RenderTemplate() => col.Template == null
: col.Template(item);

RenderFragment RenderEditTemplate() => col.EditTemplate == null
? new RenderFragment(builder => builder.CreateComponentByFieldType(this, col, item, changedType, isSearch: false, col.GetLookupService(InjectLookupService), skipValidate: true))
? new RenderFragment(builder => builder.CreateComponentByFieldType(this, col, item, changedType, isSearch: false, col.GetLookupService(InjectLookupService), skipValidate: false))
: col.EditTemplate(item);
}

Expand Down
24 changes: 17 additions & 7 deletions src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,22 @@
@if (Model != null)
{
<CascadingValue Value="this" IsFixed="true">
<EditForm @attributes="@AdditionalAttributes" id="@Id" Model="@Model"
data-bb-dissubmit="@DisableAutoSubmitString" data-bb-invalid-result="@ShowAllInvalidResultString"
style="@StyleString"
OnValidSubmit="@OnValidSubmitForm" OnInvalidSubmit="@OnInvalidSubmitForm">
<BootstrapBlazorDataAnnotationsValidator @ref="Validator" />
@ChildContent
</EditForm>
@if (IsFormless)
{
<CascadingValue Value="_formlessEditContext" IsFixed="false">
<BootstrapBlazorDataAnnotationsValidator @ref="Validator" />
@ChildContent
</CascadingValue>
}
else
{
<EditForm @attributes="@AdditionalAttributes" id="@Id" Model="@Model"
data-bb-dissubmit="@DisableAutoSubmitString" data-bb-invalid-result="@ShowAllInvalidResultString"
style="@StyleString"
OnValidSubmit="@OnValidSubmitForm" OnInvalidSubmit="@OnInvalidSubmitForm">
<BootstrapBlazorDataAnnotationsValidator @ref="Validator" />
@ChildContent
</EditForm>
}
</CascadingValue>
}
34 changes: 34 additions & 0 deletions src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,13 @@ public partial class ValidateForm
[Parameter]
public bool? ShowLabelTooltip { get; set; }

/// <summary>
/// 获得/设置 是否为无表单模式 默认 false
/// </summary>
/// <remarks>设置为 true 时不渲染 form 元素,仅级联 EditContext 用于 Table InCell 编辑模式</remarks>
[Parameter]
public bool IsFormless { get; set; }

/// <summary>
/// 获得/设置 是否禁用表单内回车自动提交功能 默认 null 未设置
/// </summary>
Expand Down Expand Up @@ -146,6 +153,15 @@ protected override void OnParametersSet()
{
DisableAutoSubmitFormByEnter = BootstrapBlazorOptions.CurrentValue.DisableAutoSubmitFormByEnter.Value;
}

// 无表单模式下创建/更新 EditContext
if (IsFormless && Model != null)
{
if (_formlessEditContext == null || _formlessEditContext.Model != Model)
{
_formlessEditContext = new EditContext(Model);
}
}
}

/// <summary>
Expand Down Expand Up @@ -330,6 +346,13 @@ internal async Task ValidateObject(ValidationContext context, List<ValidationRes
{
await validator.ToggleMessage(messages);
}

// 确保 _invalid 在没有验证组件时被正确设置
// Ensure _invalid is properly set when there are no validation components
if (_validatorCache.Count == 0)
{
_invalid = results.Count > 0;
}
}
}

Expand Down Expand Up @@ -636,6 +659,17 @@ private async Task OnInvalidSubmitForm(EditContext context)
[NotNull]
private BootstrapBlazorDataAnnotationsValidator? Validator { get; set; }

/// <summary>
/// 获得/设置 无表单模式下的 EditContext 实例
/// </summary>
private EditContext? _formlessEditContext;

/// <summary>
/// 获取 EditContext 实例
/// </summary>
/// <returns></returns>
public EditContext? GetEditContext() => _formlessEditContext;

/// <summary>
/// 验证方法 用于代码调用触发表单验证
/// </summary>
Expand Down