Razor Pages Form Submit Возвращает FormatException: входная строка была в неправильном формате - PullRequest
0 голосов
/ 06 марта 2019

Я довольно новичок в Razor Pages, но я решил, что более простая модель программирования выглядит интересной, и начал изменять мои проекты в соответствии с новым стандартом.

Мне удалось заставить другие страницыправильно работать с OnGet (), OnPost () и их асинхронными версиями, но я получаю странное сообщение об ошибке на другой странице.

Я определил форму, как показано ниже:

    <form method="post" id="coursepictures-form" role="form">
        <div class="form-row">
            <div class="form-group col-lg-2">
                <label asp-for="Year" class="form-control-label mb-1 mr-1"></label>
                <select asp-for="Year" class="form-control form-control-sm mb-1 mr-3" asp-items="@(new SelectList(Model.YearList))"></select>
            </div>

            <div class="form-group col-lg-5">
                <label asp-for="Event" class="form-control-label mb-1 mr-1"></label>
                <select asp-for="Event" class="form-control form-control-sm mb-1 mr-3" asp-items="@(new SelectList(Model.EventList, "Key", "Value"))"></select>
            </div>

            <div class="form-group col-lg-4">
                <label asp-for="Level" class="form-control-label mb-1 mr-1"></label>
                <select asp-for="Level" class="form-control form-control-sm mb-1 mr-3" asp-items="@(new SelectList(Model.LevelList, "Key", "Value"))"></select>
            </div>
            <button>Submit</button>
        </div>
    </form>

На данный момент я добавил простую кнопку отправки, чтобы попытаться отладить проблему, хотя в конечном итоге я хочу опубликовать эту форму через AJAX.

Я написал несколько версий кода AJAX и вышевсе из которых генерируют правильные данные POST и __RequestVerificationToken, но каждая версия создает одно и то же сообщение об ошибке:

FormatException: Input string was not in a correct format.
System.Number.StringToNumber(ReadOnlySpan<char> str, NumberStyles options, ref NumberBuffer number, NumberFormatInfo info, bool parseDecimal)

Отправляемые данные формы отправляются в Chrome DevTools как:

Year: Most Recent
Event: 0
Level: 0
__RequestVerificationToken: CfDJ8KjmorZungdGpmSbOzYJHuJ52QtFEFfYGJDh7JmXIfEl9fDT3tXJUVLBSQzam76NWhoSpZLMk0M5ui6dXO9-YjtZ0shVVHWX-iSRchXO3fGiz3iuPQ1RDmenjLIROTwmxFquJRujgQqee_Ay9OGLX5U

PageModel использует [BindProperties] и содержит строковые поля для получения входящих данных POST следующим образом:

    [Display(Name = "Year:")]
    public string Year { get; set; }

    [Display(Name = "Event:")]
    public string Event { get; set; }

    [Display(Name = "Level:")]
    public string Level { get; set; }

Проблема вызываетсяModel Binder и происходит до запуска метода OnPost ().

Я включу здесь полный текст исключения в случае, если это будет полезно:

System.Number.StringToNumber(ReadOnlySpan<char> str, NumberStyles options, ref NumberBuffer number, NumberFormatInfo info, bool parseDecimal)
System.Number.ParseInt32(ReadOnlySpan<char> s, NumberStyles style, NumberFormatInfo info)
int.Parse(string s, NumberStyles style, IFormatProvider provider)
System.ComponentModel.Int32Converter.FromString(string value, NumberFormatInfo formatInfo)
System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
Microsoft.AspNetCore.Mvc.ModelBinding.Internal.ModelBindingHelper.ConvertSimpleType(object value, Type destinationType, CultureInfo culture)
Microsoft.AspNetCore.Mvc.ModelBinding.Internal.ModelBindingHelper.UnwrapPossibleArrayType(object value, Type destinationType, CultureInfo culture)
Microsoft.AspNetCore.Mvc.ModelBinding.Internal.ModelBindingHelper.ConvertTo(object value, Type type, CultureInfo culture)
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.DictionaryModelBinder<TKey, TValue>.BindModelAsync(ModelBindingContext bindingContext)
Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext actionContext, IModelBinder modelBinder, IValueProvider valueProvider, ParameterDescriptor parameter, ModelMetadata metadata, object value)
Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageBinderFactory+<>c__DisplayClass2_0+<<CreatePropertyBinder>g__Bind|0>d.MoveNext()
Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.BindArgumentsCoreAsync()
Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.InvokeInnerFilterAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
ShoestringEventing.Startup+<>c+<<Configure>b__5_0>d.MoveNext() in Startup.cs

Я трахалПодумайте об этом в течение некоторого времени и, похоже, никуда не денетесь, так как я сказал, что выполнил миграцию на Razor Pages для других форм, отправленных через Form или AJAX, которые работают, но эта вызывает проблемы.

1 Ответ

0 голосов
/ 06 марта 2019

Похоже, что я использовал [BindProperties], это довольно ленивый способ, и я должен связывать только значения, которые будут получены из формы.

В этом случае в PageModel есть другие записи, которыепривыкнуть к обработчикам OnGet () и OnPost (), но они не являются частью данных формы, и именно они выдают ошибки.

После внесения этого изменения код OnPost () запускается правильно.

...