2014-10-09 15 views
7

Sono nuovo di MVC, quindi per favore andate piano con me. Mi è stato consegnato un progetto che è stato avviato in MVC e gli è stato detto di aggiungerlo. Stavo bene finché non sono arrivato a una sezione che aveva bisogno di dati da due modelli diversi. Ora sono bloccato e il mio capo lo vuole fatto ieri. Si prega di aiutare se potete.MVC - Pulsante Invia non funziona con più viste parziali

Ho una vista con due viste parziali e un pulsante di invio. Ciascuna delle viste parziali utilizza un modello diverso. Le visualizzazioni visualizzano le informazioni sullo schermo che l'utente può modificare. Viene quindi fatto clic sul pulsante di invio. Nel controller, vorrei accedere ai dati di entrambi i modelli (i valori che l'utente ha inserito sullo schermo). Al momento, non riesco nemmeno a ottenere il pulsante di invio per chiamare il controller. Questa è la parte di cui ho bisogno di aiuto immediato, ma alla fine dovrò sapere come accedere ai dati di entrambi i modelli dal controller.

Ecco l'idea di base di ciò che voglio fare:

enter image description here

Questa è la mia opinione: CreateContract.cshtml

<div class="container-fluid"> 
@using (Html.BeginForm("CreateContract", "CreateContract", FormMethod.Post, new { @class = "form-horizontal " })) 
{ 
       <div id="PartialDiv"> 
      @{ 
     Html.RenderPartial("ApplicationPartialView", new CarmelFinancialWeb.Models.ModelApplication()); 
     Html.RenderPartial("ContractPartialView"); 
      } 
     </div> 
      <input id="btnCreateContract" type="submit" class="btn btn-primary" value="Save" name="CreateContract" /> 
} 
    </div> 

Questo fa parte dei CreateContractController.cs controller. Questo metodo viene colpito quando la vista si apre e funziona correttamente.

 [AuthorizeAdmin] 
    public ActionResult CreateContract(string ID) 
    { 
     ModelContract obj_Contract = new ModelContract(); 

     obj_Contract.BuyerName = "MOCS"; 

     return View(@"~/Views/CreateContract/CreateContract.cshtml", obj_Contract); 
    } 

Questo è parte del controller CreateContractController.cs. Questo metodo non viene colpito quando si fa clic sul pulsante di invio. Ho provato ad includere la variabile ID stringa dall'altro metodo e sia ModelContract che ModelApplication (e varie combinazioni di questi), ma non riesco a ottenere questo metodo per essere chiamato.

 [AuthorizeAdmin] 
    [HttpPost] 
    public ActionResult CreateContract() 
    { 
     ModelApplication obj_App = new ModelApplication(); 
     return View(@"~/Views/CreateContract/CreateContract.cshtml", obj_App); 

    } 

Questi sono i metodi nel controller per le viste parziali. Anche questi non vengono chiamati.

 public PartialViewResult ApplicationPartialView(string ID) 
    { 
     ModelApplication obj_App = new ModelApplication(); 

     if (ID != null && ID != "0" && ID != null && ID != "") 
     { 
      obj_App = objBllApplication.GetApplicationByID(int.Parse(ID)); 
     } 

     return PartialView("CreateContractApplicationPartialView"); 
    } 

    public PartialViewResult ContractContractPartialView() 
    { 
     ModelContract obj_Contract = new ModelContract(); 

     obj_Contract.DealerID = "MOCS"; 

     return PartialView("CreateContractContractPartialView"); 
    } 
+0

Forse la versione Post del CreateContract lavoro prima? Direi che la risposta è no. Forse ha bisogno di prendere un'istanza di ModelContract in modo che possa ottenere dettagli dal modulo. –

+0

La prima cosa che cambierei è il controllo di invio. Lo farei come un pulsante invece di un input. Fai una prova e vedi se inizia a chiamare l'azione del tuo controller. – Pheonyx

+0

Pheonyx: quando l'ho modificato in un pulsante, viene visualizzato questo errore: "L'elemento del modello passato nel dizionario è di tipo 'CarmelFinancialWeb.Models.ModelContract', ma questo dizionario richiede un elemento del modello di tipo 'CarmelFinancialWeb.Models.ModelApplication '." – boilers222

risposta

13

C'è un sacco di cose sotto il cofano qui che è vantaggioso per voi di conoscere, soprattutto perché siete nuovi a questo. Innanzitutto, una vista può avere solo il modello . Il motivo di alto livello è che è effettivamente reso tramite una classe generica che il modello scelto riempie come è il tipo. Potete in qualche modo imbrogliare, come siete qui, usando le viste parziali, ma dovete ancora ottenere un'istanza di modello in quelle. Sembra che tu stia cercando di farlo creando azioni nel tuo controller per rappresentare quei partial, ma questi sono effettivamente inutili. Non vengono mai chiamati. Html.Partial o Html.RenderPartial eseguirà solo il rendering della vista specificata, con lo stesso modello della vista chiamante, per impostazione predefinita o l'oggetto passato a questi metodi come modello (secondo parametro). Non torna al controller.

In MVC, c'è qualcosa chiamato "azioni figlio" che funziona come sembra che vogliano i parziali qui. Utilizzando Html.Action o Html.RenderAction, è possibile chiamare queste azioni sul controller che restituiscono viste parziali. Due cose lì, però:

  1. Se avete intenzione di restituire una visione parziale (invece di una visione a tutti gli effetti), allora si dovrebbe decorare l'azione con [ChildActionOnly]. Altrimenti, le azioni sono esposte all'accesso diretto all'URL dal browser, che renderebbe la vista parziale da sola, senza alcun layout.

  2. Le azioni figlio possono essere utilizzate solo per richieste in stile GET. Non puoi POSTARE a un'azione di un bambino.

In realtà è meglio per cose come questa, utilizzare solo le azioni del bambino per rendere aree separate di un modulo se quelle singole aree del modulo saranno pubblicati per separare posizioni. Prendi ad esempio una pagina combinata in cui hai sia un login o un concetto di iscrizione. È possibile utilizzare azioni secondarie per eseguire il rendering di ogni singolo gruppo di campi, ma la parte di accesso deve POST a un'azione di accesso e la parte di registrazione deve essere registrata in un'azione di registrazione. Non POSTARE tutto da entrambe le forme alla stessa azione.

Nel tuo scenario particolare, le viste parziali sono in realtà la strada da percorrere, ma devi solo modificare il modello della tua vista principale per essere un modello di vista che contenga entrambi i sotto-modelli. Per esempio:

public class MyAwesomeViewModel // name doesn't matter 
{ 
    public ModelApplication Application { get; set; } 
    public ModelContract Contract { get; set; } 
} 

Poi, nella visualizzazione principale:

@model Namespace.To.MyAwesomeViewModel 

... 

@Html.Partial("ApplicationPartialView", Model.Application) 
@Html.Partial("ContractPartialView", Model.Contract) 

Infine, la vostra azione POST avrebbe preso questo modello vista come un parametro:

[HttpPost] 
public ActionResult CreateContract(MyAwesomeViewModel model) 
{ 
    ... 
} 
Problemi correlati