Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202

    ASP.NET MVC Create View from 2 model

    Ciao a tutti.

    Ho un problema di costruzione view Create.
    Poniamo di avere un model :
    codice:
        public class Ticket
        {
            public int Id { get; set; }
            
            [Required]
            [DisplayName("Oggetto")]
            public string Object { get; set; }
            .
            .
            public virtual List<Reply> Replyes { get; set; }
        }
        
        public class Reply
        {
            public int Id { get; set; }
    
            [Required]
            [DisplayName("Ticket")]
            public int Ticket_Id { get; set; }
    
            [ForeignKey("Ticket_Id")]
            public virtual Ticket Ticket { get; set; }
            
            [Required]
            [DisplayName("Testo")]
            public string Text { get; set; }
        }

    Nella mia view riesco ad accedere correttamente a :

    codice:
        <div class="form-group">
            @Html.LabelFor(model => model.Object, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Object, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Object, "", new { @class = "text-danger" })
            </div>
        </div>

    Come faccio a creare il campo Text del model Reply sempre nella view create di Ticket

    codice:
        <div class="form-group">
            @Html.LabelFor(model => model.???????, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.??????, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.???????, "", new { @class = "text-danger" })
            </div>
        </div>
    Ultima modifica di djciko; 12-11-2018 a 18:36
    Che mestiere difficile.....essere da soli ancora di più

  2. #2
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,828
    cioe' da una LISTA (List) vuoi creare una label, un editor ed un validatore ?

    Mi sa che ti stai confondendo...

  3. #3
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    Si esatto perchè il mio desiderio era che l'utente all'atto della creazione di un ticket producesse sia l'intestazione del ticket che la prima reply.
    Ho risolto in questo modo anche se non so se può andare bene.
    codice:
            public ActionResult Create()
            {
                //Qui valorizzo la ViewBag per essere disponibili nella View
                List<Project> listProject = db.Projects.ToList();
                listProject.Insert(0, new Project { Id = 0, Name = "" });
                ViewBag.listProject = new SelectList(listProject, "Id", "Name");
                //ViewBag.Reply = new Reply();
                return View();
            }
    Volevo inzialmente mettere un oggetto reply nella view bag ma non sapevo come accedere al campo Text percui l'ho creato a mano
    View :
    codice:
        <div class="form-group">
            @Html.Label("Testo", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.Editor("Text", new { htmlAttributes = new { @class = "form-control" } })
            </div>
        </div>
    Infine nel mio controller con httppost
    codice:
     [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Create([Bind(Include = "Id,Project_Id,Object")] Ticket ticket, [Bind(Include = "Text")] Reply reply)
            {
    Non so che dire.
    Ho sentito pareri che mi dicevano di creare un model specifico tipo
    codice:
    public class TicketCreationViewModel {
      [Required]
      [DisplayName("Oggetto")]
      public string Subject { get; set; } //L'"oggetto" in inglese si dice "Subject"
      [Required]
      [DisplayName("Testo")]
      public string Text { get; set; }
    }
    Ed un controller adeguato
    codice:
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(TicketCreationViewModel model)
    {
      //Validazione, per prima cosa
      if (!ModelState.IsValid) {
         return View(model);
      }
    
      //Creo un nuovo ticket e ci copio i dati del model
      var ticket = new Ticket {
         Subject = model.Subject
      };
      //Aggiungo la prima reply al ticket
      var reply = new Reply {
        Text = model.Text
      };
      ticket.Replies = new List<Reply> { reply };
    
      //TODO: qui salvi il nuovo ticket e reindirizzi l'utente
    }
    Però sono riuscito a modificando il controller creato tramite lo scaffolding a far tornare tutto.
    Unica cosa che nella view mi piacerebbe passare oggetto reply e crearle il campo text come ho creato object ma non so quale delle strade è meglio se quella che ho fatto, quella suggerita o altre.
    Di fatto su queste cose non c'è molta documentazione, consigli, esempi in giro.
    Che mestiere difficile.....essere da soli ancora di più

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,828
    sta tutto nel modellare correttamente (il controller poi gestisce il model in conseguenza).

    quindi la seconda opzione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2021 vBulletin Solutions, Inc. All rights reserved.