Список пользовательских элементов модели страницы сохранения MVC при отправке для использования в методе публикации

У меня есть список пользовательских объектов с именем DocumentDTO, который создается и заполняется значениями при загрузке страницы. Когда страница отправлена, мне нужно отправить значения из списка для использования в методе публикации контроллера.

Есть ли способ сделать это для элементов списка с пользовательскими объектами? Я могу сделать это, когда это список строк, но он не работает, когда его пользовательские объекты

Для других полей я делаю это:

 < input asp-for = "FileID" type = "hidden" /> 

И для строковых списков я делаю это:

    @for (int i = 0; i < Model.StringList.Count(); i++)
    {
        <input asp-for = "StringList[i]" type = "text">
    }

Но у меня есть эта модель:

public class FileModel
{
     public string Email { get; set; }

     public string FileNumber { get; set; }

     public List<DocumentDTO> DocumentListing { get; set; }

    public class DocumentDTO
    {
    
        public string DocName { get; set; }

        public string Comments { get; set; }

        public int docID { get; set; }

    }
}

Но обе приведенные ниже попытки не позволяют мне видеть элементы списка в методе публикации контроллера при отправке (в списке указано, что он имеет счет 0)

int DocumentsCount = Model.DocumentListing.Count();


 for (int i = 0; i < DocumentsCount; i++)
{
    <input asp-for = "DocumentListing[i].DocName" type = "hidden">
    <input asp-for = "DocumentListing[i].docID" type = "hidden">
    <input asp-for = "DocumentListing[i].Comments" type = "hidden">
}

Возможно ли это сделать, и если возможно, кто-нибудь может помочь?

Привет @ user9758771, Обязательно удалите недопустимые входные данные в представлении бритвы. То есть удалите <input asp-for"DocumentListing" type = "hidden"> и <input asp-for = "DocumentListing[i]" type = "hidden">. После этого вы сможете успешно отправлять данные в серверную часть.

Rena 14.12.2020 03:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
286
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, вам нужно знать, что для каждого свойства сложного типа привязка модели просматривает источники для шаблона имени prefix.property_name. Если ничего не найдено, ищется просто property_name без префикса.

В вашем коде у вас есть DocumentListing и DocumentListing[i] и DocumentListing[i].DocName в вашем представлении бритвы. Но DocumentListing и DocumentListing[i] недействительны, поскольку привязка модели не может искать для них соответствующее свойство.

Обязательно удалите недопустимые входные данные и разместите действительные свойства в бэкэнде:

@model FileModel
@{int DocumentsCount = Model.DocumentListing.Count(); }
<form asp-action = "Create">
    @*<input asp-for = "DocumentListing" type = "hidden">*@          //remove this

    @for (int i = 0; i < DocumentsCount; i++)
    {
        Model.DocumentListing.Add(Model.DocumentListing.ElementAtOrDefault(i));

        @*<input asp-for = "DocumentListing[i]" type = "hidden">*@    //remove this
        <input asp-for = "DocumentListing[i].DocName" type = "hidden">
    }
    <input type = "submit" value = "create" />
</form>

Обновлять:

Контроллер:

[HttpPost]
public IActionResult Create([Bind(Prefix = "DocumentListing")]List<DocumentDTO> model)
{
    //...
    return View();
}

Или:

[HttpPost]
public IActionResult Create(FileModel model)
{
    //...
    return View();
}

Проверьте, что ваш html в интерфейсе должен выглядеть следующим образом:

Обновление2:

Хорошо, приятно знать, я только что вытащил их. Интересно, что модель, прошедшая через сообщение, по-прежнему не содержит элементов списка. Можно ли передать элементы списка? И я заметил, что эти скрытые поля в конечном итоге передаются в самой форме, а не через модель. Я не уверен, почему это так.

user9758771 14.12.2020 03:45

Привет @ user9758771, не могли бы вы обновить свой вид бритвы? В противном случае я не могу воспроизвести проблему. Спасибо.

Rena 14.12.2020 03:48

Конечно, я только что обновил его. В идеале я просто хотел бы передать каждый весь объект DocumentListing в списке почтовому запросу. Спасибо

user9758771 14.12.2020 04:02

Немного невероятно, что я использовал ваш код и все еще мог успешно передать данные в бэкэнд. Убедитесь, что ваше бэкэнд-действие содержит [HttpPost], а модель восстановления должна быть FileModel. Я думаю, вам нужно проверить имя ввода в браузере. Имя ввода должно быть таким :name = "DocumentListing[0].DocName"Просто нажмите F12 и проверьте, как показано на следующей гифке:i.stack.imgur.com/1PkkR.gif

Rena 14.12.2020 04:14

Если ваша бэкэнд-модель не является FileModel, вы также можете использовать [Bind(Prefix = "DocumentListing")]List<DocumentDTO> model.

Rena 14.12.2020 04:17

Привет @ user9758771, проверьте мой обновленный ответ, я думаю, что он более подробный и может помочь вам в устранении неполадок.

Rena 14.12.2020 04:24

Спасибо за обновление, и я посмотрю на это больше. Я подтвердил, что именно так он отображается в браузере для меня. Итак, в методе post у вас был список DocumentListing модели, заполненный значениями? Вы используете .net Core?

user9758771 14.12.2020 04:31

Да. Я использую .Net Core и список документов, заполненный значениями. Вы могли видеть gif, который я обновил в ответе.

Rena 14.12.2020 04:34

Кстати, если у вас все еще не работает, я предлагаю вам создать новый проект asp.net core mvc и проверить, может ли он работать хорошо или нет. Или, если вы поделитесь с нами всем кодом, будет полезнее.

Rena 14.12.2020 04:37

Да, он все еще не работает .... Это так странно, что я вижу, что он работает для вас, и это именно то, что у меня есть, но для меня он показывает, что в списке 0 элементов. Я думаю, что собираюсь переосмыслить стратегию для этого, потому что это сложнее, чем я написал, и в этом списке может быть много элементов, поэтому я не хочу иметь около 1000 скрытых полей. Возможно, позже сделаю репост, но большое спасибо за совет.

user9758771 14.12.2020 04:44

Добро пожаловать. Ждем вашего ответа, и пусть у вас все получится.

Rena 14.12.2020 04:47

Другие вопросы по теме