Как связать сложный тип, содержащий список в ASP. Net? - PullRequest
0 голосов
/ 09 июля 2020

Итак, у меня есть такая модель:

public class EventViewModel
{
    public string Title { get; set; }
    public List<EventParticipant> Participants { get; set; }
}

public class EventParticipant
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Strength { get; set; }
    public string Losses { get; set; }

}

и у меня есть форма, в которой есть поле для:

  1. Title
  2. Multiple участники
    <form asp-controller="Event" asp-action="Create" method="post">  

        <input asp-for="Title" class="form-controls/>
                                
        <input asp-for="Participants[0].Name" class="form-controls/>                                
        <input asp-for="Participants[0].Strength" class="form-controls/>      
        <input asp-for="Participants[0].Losses" class="form-controls/>    
     
        <input asp-for="Participants[1].Name" class="form-controls/>                                
        <input asp-for="Participants[1].Strength" class="form-controls/>      
        <input asp-for="Participants[1].Losses" class="form-controls/> 
         
        <input type="submit" class="form-controls/>     
    </form>

Когда я go перехожу на страницу с указанным выше кодом, я получаю следующую ошибку:

System.NullReferenceException: 'Object reference not set to an instance of an object.'

с выделением первого ввода «Участники» .

Как сделать так, чтобы после публикации я мог получить доступ к списку участников, например:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(EventViewModel model)
    {
        foreach (var participant in model.Participants)
        {
            Debug.WriteLine("Name: " + participant.Name);
        }
        return RedirectToAction("Create");
    }

Ответы [ 2 ]

1 голос
/ 09 июля 2020

просто добавьте подрядчика в свой класс:

public class EventViewModel
{
    public string Title { get; set; }
    public List<EventParticipant> Participants { get; set; }

  public EventViewModel()
  {
     this.Participants = new List<EventParticipant>();
  }

}

это предотвратит Participants нулевую ошибку.

тогда вы можете использовать foreach для доступа к EventParticipant в вашем просмотров, безопасно.

1 голос
/ 09 июля 2020

Используйте asp-for="@Model.Participants[0].Name", будет работать. Также для динамического списка привязки вы можете попробовать перебрать Model.Participants, как показано ниже.

Подробнее см. https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-3.1#expression -names-and-collections

<form asp-controller="Event" asp-action="Create" method="post">  

    <input asp-for="Title" class="form-controls/>
                        
    @for (int i = 0; i < Model.Participants.Count; i++)
    {       
        <input asp-for="@Model.Participants[i].Name" class="form-controls/>                                
        <input asp-for="@Model.Participants[i].Strength" class="form-controls/>      
        <input asp-for="@Model.Participants[i].Losses" class="form-controls/>    
    }
     
    <input type="submit" class="form-controls/>     
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...