помощник тега [asp-for] для ввода не работает со значениями байтового массива (в отличие от @ Html.HiddenFor)

Когда @Html.HiddenFor(e=>e.RowVersion) работает хорошо и генерирует:

<input id="RowVersion" name="RowVersion" type="hidden" value="AAAAAAAARlI=" /> 

Но вспомогательная версия тега <input asp-for="@Model.RowVersion" name="RowVersion" hidden /> генерирует:

<input name="RowVersion" hidden id="RowVersion" value="System.Byte[]" />

Проблема в сумасшедшем значении "System.Byte []".

Я хочу продолжать использовать вспомогательную версию тега для единообразия. Как включить сериализацию массива байтов?


person Roman Pokrovskij    schedule 02.05.2019    source источник
comment
RowVersion байтовый массив?   -  person Scott Hannen    schedule 02.05.2019
comment
Да, это так. RowVersion - это массив байтов docs.microsoft.com/en-us/sql/t-sql/data-types/ и docs.microsoft.com/en-us/ef/core/modeling/concurrency   -  person Roman Pokrovskij    schedule 02.05.2019
comment
Я должен быть в каком-то особом состоянии слепого забвения, чтобы прочитать ваш вопрос, а затем спросить то, что я только что спросил.   -  person Scott Hannen    schedule 02.05.2019


Ответы (1)


Используйте type="hidden" вместо атрибута hidden!

Вы сможете добиться того же, если сделаете

/*
 *   From the ViewModel:
 *       byte[] RowVersion = Encoding.UTF8.GetBytes("FR")
 */
<input asp-for="RowVersion" type="hidden" />

Сравнение

введите здесь описание изображения  введите описание изображения здесь

Причина (хотя я не уверен на 100%)

Вспомогательная функция тега asp-for попытается сгенерировать тип для ввода HTML на основе типа свойства, к которому привязана вспомогательная функция тега, если вы не укажете атрибут type на вводе HTML. Если он не может найти правильный тип для ввода HTML, по умолчанию будет type="text".

Вот почему ваш <input asp-for="RowVersion" hidden /> создаст скрытое текстовое поле. Помощник тега не очищает входное значение при создании текстового поля:

введите здесь описание изображения

Но если вы укажете type="hidden", а ваш тип свойства - byte[], он фактически выполнит кодировку Base64 за вас:

введите здесь описание изображения

Вот почему @Html.HiddenFor(), а также <input type="hidden" asp-for= /> работали, а другие - нет!

person David Liang    schedule 02.05.2019
comment
Спасибо. Следующий вопрос: ПОЧЕМУ ЭТО РАБОТАЕТ? - person Roman Pokrovskij; 02.05.2019
comment
Молодец, спасибо. В следующий раз я буду готов поэкспериментировать с атрибутом типа. - person Roman Pokrovskij; 02.05.2019
comment
Это не причуда ASP.NET. тип ввода по умолчанию - text, а hidden - это глобальный атрибут, который применяется к каждому элементу HTML. . Все браузеры будут рассматривать <input hidden id='RowVersion' /> как <input type="text" hidden id='RowVersion' />. - person Panagiotis Kanavos; 05.05.2021