diff --git a/src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs b/src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs index 2a469da63f..495d7b8b6f 100644 --- a/src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs +++ b/src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs @@ -54,22 +54,6 @@ namespace Microsoft.AspNetCore.Components public static string GetEventHandlerValue(string value) where T : Microsoft.AspNetCore.Components.UIEventArgs { throw null; } public static string GetValue(System.DateTime value, string format) { throw null; } public static T GetValue(T value) { throw null; } - public static System.Action SetValueHandler(System.Action setter, bool existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, System.DateTime existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, System.DateTime existingValue, string format) { throw null; } - public static System.Action SetValueHandler(System.Action setter, decimal existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, double existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, int existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, long existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, bool? existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, decimal? existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, double? existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, int? existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, long? existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, float? existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, float existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, string existingValue) { throw null; } - public static System.Action SetValueHandler(System.Action setter, T existingValue) { throw null; } } [System.AttributeUsageAttribute(System.AttributeTargets.Property, AllowMultiple=false, Inherited=true)] public sealed partial class CascadingParameterAttribute : System.Attribute diff --git a/src/Components/Components/src/BindMethods.cs b/src/Components/Components/src/BindMethods.cs index 4c0962ed01..fb5b890ffb 100644 --- a/src/Components/Components/src/BindMethods.cs +++ b/src/Components/Components/src/BindMethods.cs @@ -86,229 +86,5 @@ namespace Microsoft.AspNetCore.Components { return value; } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, string existingValue) - { - return eventArgs => - { - setter((string)((UIChangeEventArgs)eventArgs).Value); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, bool existingValue) - { - return eventArgs => - { - setter((bool)((UIChangeEventArgs)eventArgs).Value); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, bool? existingValue) - { - return eventArgs => - { - setter((bool?)((UIChangeEventArgs)eventArgs).Value); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, int existingValue) - { - return eventArgs => - { - setter(int.Parse((string)((UIChangeEventArgs)eventArgs).Value)); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, int? existingValue) - { - return eventArgs => - { - setter(int.TryParse((string)((UIChangeEventArgs)eventArgs).Value, out var value) ? value : (int?)null); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, long existingValue) - { - return eventArgs => - { - setter(long.Parse((string)((UIChangeEventArgs)eventArgs).Value)); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, long? existingValue) - { - return eventArgs => - { - setter(long.TryParse((string)((UIChangeEventArgs)eventArgs).Value, out var value) ? value : (long?)null); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, float existingValue) - { - return eventArgs => - { - setter(float.Parse((string)((UIChangeEventArgs)eventArgs).Value)); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, float? existingValue) - { - return eventArgs => - { - setter(float.TryParse((string)((UIChangeEventArgs)eventArgs).Value, out var value) ? value : (float?)null); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, double existingValue) - { - return eventArgs => - { - setter(double.Parse((string)((UIChangeEventArgs)eventArgs).Value)); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, double? existingValue) - { - return eventArgs => - { - setter(double.TryParse((string)((UIChangeEventArgs)eventArgs).Value, out var value) ? value : (double?)null); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, decimal existingValue) - { - return eventArgs => - { - setter(decimal.Parse((string)((UIChangeEventArgs)eventArgs).Value)); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, decimal? existingValue) - { - return eventArgs => - { - setter(decimal.TryParse((string)((UIChangeEventArgs)eventArgs).Value, out var tmpvalue) ? tmpvalue : (decimal?)null); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, DateTime existingValue) - { - return eventArgs => - { - SetDateTimeValue(setter, ((UIChangeEventArgs)eventArgs).Value, null); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, DateTime existingValue, string format) - { - return eventArgs => - { - SetDateTimeValue(setter, ((UIChangeEventArgs)eventArgs).Value, format); - }; - } - - /// - /// Not intended to be used directly. - /// - public static Action SetValueHandler(Action setter, T existingValue) - { - if (!typeof(T).IsEnum) - { - throw new ArgumentException($"'bind' does not accept values of type {typeof(T).FullName}. To read and write this value type, wrap it in a property of type string with suitable getters and setters."); - } - - return eventArgs => - { - var value = (string)((UIChangeEventArgs)eventArgs).Value; - var parsed = (T)Enum.Parse(typeof(T), value); - setter(parsed); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - }; - } - - private static void SetDateTimeValue(Action setter, object objValue, string format) - { - var stringValue = (string)objValue; - var parsedValue = string.IsNullOrEmpty(stringValue) ? default - : format != null && DateTime.TryParseExact(stringValue, format, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var parsedExact) ? parsedExact - : DateTime.Parse(stringValue); - setter(parsedValue); - _ = DispatchEventAsync(setter.Target, EventCallbackWorkItem.Empty, UIEventArgs.Empty); - } - - // This is a temporary polyfill for these old-style bind methods until they can be removed. - // This doesn't do proper error handling (usage is fire-and-forget). - private static Task DispatchEventAsync(object component, EventCallbackWorkItem callback, object arg) - { - if (component == null) - { - throw new ArgumentNullException(nameof(component)); - } - - if (component is IHandleEvent handler) - { - return handler.HandleEventAsync(callback, arg); - } - - return callback.InvokeAsync(arg); - } } } diff --git a/src/Components/Components/src/Forms/InputComponents/InputCheckbox.cs b/src/Components/Components/src/Forms/InputComponents/InputCheckbox.cs index 1eb09e022d..4cfcabd1aa 100644 --- a/src/Components/Components/src/Forms/InputComponents/InputCheckbox.cs +++ b/src/Components/Components/src/Forms/InputComponents/InputCheckbox.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Components.Forms builder.AddAttribute(3, "id", Id); builder.AddAttribute(4, "class", CssClass); builder.AddAttribute(5, "checked", BindMethods.GetValue(CurrentValue)); - builder.AddAttribute(6, "onchange", BindMethods.SetValueHandler(__value => CurrentValue = __value, CurrentValue)); + builder.AddAttribute(6, "onchange", EventCallback.Factory.CreateBinder(this, __value => CurrentValue = __value, CurrentValue)); builder.CloseElement(); } diff --git a/src/Components/Components/src/Forms/InputComponents/InputDate.cs b/src/Components/Components/src/Forms/InputComponents/InputDate.cs index 26e253b3c7..112bbf322d 100644 --- a/src/Components/Components/src/Forms/InputComponents/InputDate.cs +++ b/src/Components/Components/src/Forms/InputComponents/InputDate.cs @@ -28,7 +28,7 @@ namespace Microsoft.AspNetCore.Components.Forms builder.AddAttribute(3, "id", Id); builder.AddAttribute(4, "class", CssClass); builder.AddAttribute(5, "value", BindMethods.GetValue(CurrentValueAsString)); - builder.AddAttribute(6, "onchange", BindMethods.SetValueHandler(__value => CurrentValueAsString = __value, CurrentValueAsString)); + builder.AddAttribute(6, "onchange", EventCallback.Factory.CreateBinder(this, __value => CurrentValueAsString = __value, CurrentValueAsString)); builder.CloseElement(); } diff --git a/src/Components/Components/src/Forms/InputComponents/InputNumber.cs b/src/Components/Components/src/Forms/InputComponents/InputNumber.cs index 9301f33559..2abc41c0d8 100644 --- a/src/Components/Components/src/Forms/InputComponents/InputNumber.cs +++ b/src/Components/Components/src/Forms/InputComponents/InputNumber.cs @@ -68,7 +68,7 @@ namespace Microsoft.AspNetCore.Components.Forms builder.AddAttribute(4, "id", Id); builder.AddAttribute(5, "class", CssClass); builder.AddAttribute(6, "value", BindMethods.GetValue(CurrentValueAsString)); - builder.AddAttribute(7, "onchange", BindMethods.SetValueHandler(__value => CurrentValueAsString = __value, CurrentValueAsString)); + builder.AddAttribute(7, "onchange", EventCallback.Factory.CreateBinder(this, __value => CurrentValueAsString = __value, CurrentValueAsString)); builder.CloseElement(); } diff --git a/src/Components/Components/src/Forms/InputComponents/InputSelect.cs b/src/Components/Components/src/Forms/InputComponents/InputSelect.cs index e54a8078c6..7847b9f095 100644 --- a/src/Components/Components/src/Forms/InputComponents/InputSelect.cs +++ b/src/Components/Components/src/Forms/InputComponents/InputSelect.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Components.Forms builder.AddAttribute(2, "id", Id); builder.AddAttribute(3, "class", CssClass); builder.AddAttribute(4, "value", BindMethods.GetValue(CurrentValueAsString)); - builder.AddAttribute(5, "onchange", BindMethods.SetValueHandler(__value => CurrentValueAsString = __value, CurrentValueAsString)); + builder.AddAttribute(5, "onchange", EventCallback.Factory.CreateBinder(this, __value => CurrentValueAsString = __value, CurrentValueAsString)); builder.AddContent(6, ChildContent); builder.CloseElement(); } diff --git a/src/Components/Components/src/Forms/InputComponents/InputText.cs b/src/Components/Components/src/Forms/InputComponents/InputText.cs index 8617bbc784..f1f08eb46a 100644 --- a/src/Components/Components/src/Forms/InputComponents/InputText.cs +++ b/src/Components/Components/src/Forms/InputComponents/InputText.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Components.Forms builder.AddAttribute(2, "id", Id); builder.AddAttribute(3, "class", CssClass); builder.AddAttribute(4, "value", BindMethods.GetValue(CurrentValue)); - builder.AddAttribute(5, "onchange", BindMethods.SetValueHandler(__value => CurrentValue = __value, CurrentValue)); + builder.AddAttribute(5, "onchange", EventCallback.Factory.CreateBinder(this, __value => CurrentValueAsString = __value, CurrentValueAsString)); builder.CloseElement(); } diff --git a/src/Components/Components/src/Forms/InputComponents/InputTextArea.cs b/src/Components/Components/src/Forms/InputComponents/InputTextArea.cs index e7a9a172a9..3358d2e167 100644 --- a/src/Components/Components/src/Forms/InputComponents/InputTextArea.cs +++ b/src/Components/Components/src/Forms/InputComponents/InputTextArea.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Components.Forms builder.AddAttribute(2, "id", Id); builder.AddAttribute(3, "class", CssClass); builder.AddAttribute(4, "value", BindMethods.GetValue(CurrentValue)); - builder.AddAttribute(5, "onchange", BindMethods.SetValueHandler(__value => CurrentValue = __value, CurrentValue)); + builder.AddAttribute(5, "onchange", EventCallback.Factory.CreateBinder(this, __value => CurrentValueAsString = __value, CurrentValueAsString)); builder.CloseElement(); } diff --git a/src/Components/Components/test/RendererTest.cs b/src/Components/Components/test/RendererTest.cs index 5d009f5ff9..054d5511bf 100644 --- a/src/Components/Components/test/RendererTest.cs +++ b/src/Components/Components/test/RendererTest.cs @@ -3684,11 +3684,11 @@ namespace Microsoft.AspNetCore.Components.Test builder.OpenElement(0, "input"); builder.AddAttribute(1, "type", "checkbox"); builder.AddAttribute(2, "value", BindMethods.GetValue(CheckboxEnabled)); - builder.AddAttribute(3, "onchange", BindMethods.SetValueHandler(__value => CheckboxEnabled = __value, CheckboxEnabled)); + builder.AddAttribute(3, "onchange", EventCallback.Factory.CreateBinder(this, __value => CheckboxEnabled = __value, CheckboxEnabled)); builder.CloseElement(); builder.OpenElement(4, "input"); builder.AddAttribute(5, "value", BindMethods.GetValue(SomeStringProperty)); - builder.AddAttribute(6, "onchange", BindMethods.SetValueHandler(__value => SomeStringProperty = __value, SomeStringProperty)); + builder.AddAttribute(6, "onchange", EventCallback.Factory.CreateBinder(this, __value => SomeStringProperty = __value, SomeStringProperty)); builder.AddAttribute(7, "disabled", !CheckboxEnabled); builder.CloseElement(); } diff --git a/src/Components/test/testassets/TestServer/Startup.cs b/src/Components/test/testassets/TestServer/Startup.cs index 37172cfd62..b62dc7edad 100644 --- a/src/Components/test/testassets/TestServer/Startup.cs +++ b/src/Components/test/testassets/TestServer/Startup.cs @@ -72,14 +72,6 @@ namespace TestServer }); }); - app.UseRouting(); - - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - endpoints.MapRazorPages(); - }); - // Separately, mount a prerendered server-side Blazor app on /prerendered app.Map("/prerendered", subdirApp => { @@ -92,6 +84,14 @@ namespace TestServer endpoints.MapBlazorHub(); }); }); + + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + endpoints.MapRazorPages(); + }); } } }