У меня есть список пользовательских объектов с именем 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">
}
Возможно ли это сделать, и если возможно, кто-нибудь может помочь?
Во-первых, вам нужно знать, что для каждого свойства сложного типа привязка модели просматривает источники для шаблона имени 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 в интерфейсе должен выглядеть следующим образом:
Хорошо, приятно знать, я только что вытащил их. Интересно, что модель, прошедшая через сообщение, по-прежнему не содержит элементов списка. Можно ли передать элементы списка? И я заметил, что эти скрытые поля в конечном итоге передаются в самой форме, а не через модель. Я не уверен, почему это так.
Привет @ user9758771, не могли бы вы обновить свой вид бритвы? В противном случае я не могу воспроизвести проблему. Спасибо.
Конечно, я только что обновил его. В идеале я просто хотел бы передать каждый весь объект DocumentListing в списке почтовому запросу. Спасибо
Немного невероятно, что я использовал ваш код и все еще мог успешно передать данные в бэкэнд. Убедитесь, что ваше бэкэнд-действие содержит [HttpPost]
, а модель восстановления должна быть FileModel
. Я думаю, вам нужно проверить имя ввода в браузере. Имя ввода должно быть таким :name = "DocumentListing[0].DocName"
Просто нажмите F12 и проверьте, как показано на следующей гифке:i.stack.imgur.com/1PkkR.gif
Если ваша бэкэнд-модель не является FileModel
, вы также можете использовать [Bind(Prefix = "DocumentListing")]List<DocumentDTO> model
.
Привет @ user9758771, проверьте мой обновленный ответ, я думаю, что он более подробный и может помочь вам в устранении неполадок.
Спасибо за обновление, и я посмотрю на это больше. Я подтвердил, что именно так он отображается в браузере для меня. Итак, в методе post у вас был список DocumentListing модели, заполненный значениями? Вы используете .net Core?
Да. Я использую .Net Core и список документов, заполненный значениями. Вы могли видеть gif, который я обновил в ответе.
Кстати, если у вас все еще не работает, я предлагаю вам создать новый проект asp.net core mvc и проверить, может ли он работать хорошо или нет. Или, если вы поделитесь с нами всем кодом, будет полезнее.
Да, он все еще не работает .... Это так странно, что я вижу, что он работает для вас, и это именно то, что у меня есть, но для меня он показывает, что в списке 0 элементов. Я думаю, что собираюсь переосмыслить стратегию для этого, потому что это сложнее, чем я написал, и в этом списке может быть много элементов, поэтому я не хочу иметь около 1000 скрытых полей. Возможно, позже сделаю репост, но большое спасибо за совет.
Добро пожаловать. Ждем вашего ответа, и пусть у вас все получится.
Привет @ user9758771, Обязательно удалите недопустимые входные данные в представлении бритвы. То есть удалите
<input asp-for"DocumentListing" type = "hidden">
и<input asp-for = "DocumentListing[i]" type = "hidden">
. После этого вы сможете успешно отправлять данные в серверную часть.