AminMhmdi Ответов: 1

Почему MVC editfor и textboxfor не принимают пробел


я создаю "AddNewItem.cshtml" в своем проекте, используя строительные леса
но созданные помощником в страница не принимаем пространства
я пытаюсь изменить его на TextboxFor, но ничего не меняю
я не использую никаких аннотаций в своем коде модели он просто имеет одно поле int64 в качестве ключа и имеет много строковых полей

вот моя модель
public class Book
    {
        [Key]
        public Int64 ISBN { get; set; }

        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int BookID { get; set; }

        public string bookName { get; set; }
        public string bookSummery { get; set; }
        public string bookImagePath { get; set; }
        public string bookAuthor { get; set; }

       
        public string bookCountry { get; set; }

        public virtual ICollection Chapters { get; set;}

    }

а вот образец вида строительных лесов
что не так с моим кодом?

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    @Html.LabelFor(model => model.bookName)
    @Html.TextBoxFor(model => model.bookName)
    @Html.ValidationMessageFor(model => model.bookName, "")
    @Html.LabelFor(model => model.bookSummery)
    @Html.TextAreaFor(model => model.bookSummery)
    @Html.ValidationMessageFor(model => model.bookSummery, "")


Что я уже пробовал:

я просто создаю свои страницы с помощью строительных лесов и ничего не меняю, но никто из встроенных текстовых элементов управления MVC не принимает пространство от пользователя

njammy

Какой тип объявлен model. ISBN?

AminMhmdi

int64, как я уже сказал , все помощники EditFor с разными типами данных имеют одну и ту же проблему

Afzaal Ahmad Zeeshan

Вы не можете иметь несколько пробелов в HTML, подумайте об использовании " "чтобы добавить больше (или несколько) пробелов в ваш HTML-документ.

AminMhmdi

@afzaal вы поняли мой вопрос??

Afzaal Ahmad Zeeshan

Тогда о каком пространстве вы говорите? Это удаление пробелов при хранении, это выдача ошибок. Что происходит не так?

AminMhmdi

в виду того, что у меня есть несколько помощников editoFor для ввода названия книги и ...но этот textboxs не принимает никакого пространства от пользователя.

1 Ответов

Рейтинг:
1

Richard Deeming

Проблема в том, что строка с пробелами в ней не является допустимой Int64 ценность.

Даже если культура вашего сервера настроена на использование пробела в качестве разделителя тысяч, код, который преобразует разнесенное значение в Int64 не позволит.

Это была известная проблема в течение длительного времени. Обходной путь заключается в использовании пользовательского связующего элемента модели:
Модель привязки десятичных значений-Вы были взломаны[^]

using System;
using System.Globalization;
using System.Web.Mvc;

public class Int64ModelBinder : IModelBinder 
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    {
        ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        ModelState modelState = new ModelState { Value = valueResult };
        
        object result = null;
        
        long int64Value;
        if (long.TryParse(valueResult.AttemptedValue, NumberStyles.Integer | NumberStyles.AllowThousands, valueResult.Culture, out int64Value))
        {
            result = int64Value;
        }
        else
        {
            modelState.Errors.Add($"'{valueResult.AttemptedValue}' is not a valid number.");
        }
        
        bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
        return result;
    }
}


AminMhmdi

как я уже сказал, другое поле - это тип строки.я обновляю вопрос

Richard Deeming

Код в вашем вопросе ясно показывает, что ISBN поля-это Int64.

Если поле было string, и у вас не было никаких других ограничений, которые Вы нам не показали, тогда у него не было бы проблем с принятием пространства.

AminMhmdi

@richard tnx но как насчет других полей??например bookName это строка но она также не принимает пробел

Richard Deeming

Тогда, должно быть, происходит что-то еще, чего Вы нам не показали.

Если только у вас где-то нет дополнительной проверки, а string свойство не будет иметь никаких проблем с принятием значения с пробелами в нем.