2014-05-11 10 views
12

Sto provando a passare un modello diverso alla vista parziale da una vista. Ho due azioni di controller separate per entrambi e due diversi modelli di visualizzazione. Ma quando chiamo la vista parziale dall'interno della vista mi dà l'errorepassa un modello diverso alla vista parziale

L'elemento del modello passato nel dizionario è di tipo 'Application.ViewModels.Model1ViewModel', ma questo dizionario richiede un elemento del modello di tipo 'Applicazione. ViewModels.PartialViewModel'.

mi chiamo così:

@Html.Partial("_CreateUniFunctionPartial") 

la chiamata modello nella vista è

@model Application.ViewModels.Model1ViewModel 

e il modello nel file di vista parziale è

@model Application.ViewModels.PartialViewModel 

Non sono sicuro come passare la vista parziale in modo da non dare questo errore.

EDIT

Parziale vista

@model Application.ViewModels.PartialViewModel 



@using (Html.BeginForm("partialview", "ApplicationDetail", FormMethod.Post)) 
    { 


<div class="form-horizontal"> 
    <h4>UniFunctionViewModel</h4> 
    <hr /> 
    @Html.ValidationSummary(true) 





    <div class="form-group"> 
     @Html.LabelFor(model => model.detail, new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.TextBoxFor(model => model.detail, new { @placeholder = "Further Information" }) 
      @Html.ValidationMessageFor(model => model.detail) 
     </div> 
    </div> 


</div> 

}

risposta

3

Questo è abbastanza semplice da fare. C'è una direttiva html che può rendere una vista parziale. Segue l'esempio del codice:

@Html.Partial("nameOfPartial", Model) 

Ora qui il modello potrebbe provenire dal controller principale.

oppure si può definire una nuova azione del controller con partialviewresult come tipo di ritorno e cercare di renderlo nella pagina come questa:

@{Html.RenderAction("Someaction", "somecontroller");} 
+0

Che pretende molto lavoro. Ho provato che entrambi gli – user3541362

+0

non funzionano? Può essere più preciso? – qamar

+2

@ Html.Partial ("nameOfPartial", Model) che fornisce un modello come questo non funziona.si scontra ancora con il modello nella vista principale. la vista parziale contiene un modulo, il metodo di renderizzazione riceverà il post quando lo sto usando? – user3541362

18

si utilizza il metodo giusto, ma non passando gli argomenti giusti

si potrebbe desiderare di provare in questo modo:

@Html.Partial("~/[path_to_root_only_if_exists]/_CreateUniFunctionPartial.cshtml", new Application.ViewModels.PartialViewModel()) 

se non si passa in un modello, ci vorrà automaticamente quello dal suo genitore, che nel tuo caso è

Application.ViewModels.Model1ViewModel 
+0

Se ne hai uno che deve ottenere dati da un DB, fare qualcosa di complesso, ecc, allora posso ancora usare 'RenderPartial' per ** basta mappare i dati alla proprietà Model **, controlla [questo] (http://stackoverflow.com/a/17627843/2218697) – stom

4

Una cosa che devi fare è rigenerare un modello o utilizzare una proprietà nel modello. Per esempio:

public class OuterViewModel 
{ 
    public InnerViewModel InnerViewModel { get; set; } 
} 

public class InnerViewModel 
{ 
    public string SomeProperty { get; set; } 
} 

Nella pagina iniziale, è possibile accettare l'OuterViewModel, quindi passare l'InnerViewModel al parziale.

Outer.cshtml:

@model OuterViewModel 
@Html.Partial("_InnerPartial", Model.InnerViewModel) 

_InnerPartial.cshtml:

@model InnerViewModel 
@using (Html.BeginForm("Inner", "Controller")) 
{ 
     <div> 
      @Html.AntiForgeryToken() 
      @Html.TextBoxFor(m => m.SomeProperty) 
      <input type="submit" value="Save" /> 
     </div> 
}