2015-08-06 15 views
7

ho creato una vista che stava lavorando con successo con 1 visitaaggiungendo 2 modelli IEnumerable nel 1 visita

@model IEnumerable<string> 
<ul> 
    @foreach (var fName in Model) 
    { 
     var name = fName; 
     var link = @Url.Content("~/Content/archives/mgamm/") + name.Replace(" ", "%20"); 

     <li style="list-style:none; font-size:1.2em;"> 
      <a href="@link">@name</a> 
     </li> 
    } 
</ul> 
@if (User.IsInRole("admin")) 
{ 
    <div> 
     @using (Html.BeginForm("Index", "Archives", FormMethod.Post, new { enctype = "multipart/form-data" })) 
     { 
      <input type="File" name="file" id="file" value="Choose File" /> 
      <button type="submit">Upload</button> 
     } 
    </div> 
} 

con un controller

namespace plantationmvc.Controllers 
{ 
    public class ArchivesController : Controller 
    { 
     // 
     // GET: /Archives/ 
     public ActionResult Index() 
     { 
      var path = Server.MapPath("~/Content/archives/mgamm"); 

      var dir = new DirectoryInfo(path); 

      var files = dir.EnumerateFiles().Select(f => f.Name); 

      return View(files); 
     } 

     [HttpPost] 
     public ActionResult Index(HttpPostedFileBase file) 
     { 
      var path = Path.Combine(Server.MapPath("~/Content/archives/mgamm"), file.FileName); 

      var data = new byte[file.ContentLength]; 
      file.InputStream.Read(data, 0, file.ContentLength); 

      using (var sw = new FileStream(path, FileMode.Create)) 
      { 
       sw.Write(data, 0, data.Length); 
      } 

      return RedirectToAction("Index"); 
     } 
    } 
} 

Tuttavia ho voluto aggiungere un altro frammento di come questo sulla stessa pagina, ma con un percorso di contenuto diverso.

Come si aggiunge un altro modello a questa pagina?

Ho appena avuto un controller e vista, quindi ho creato un ViewModel la creazione di 2 classi

namespace plantationmvc.Models 
{ 
    public class ArchivesViewModel 
    { 
     public CommModel Model1 { get; set; } 
     public MeetModel Model2 { get; set; } 
    } 

    public class CommModel 
    { 
     public IEnumerable<CommModel>    
    } 
    public class MeetModel 
    { 
     public IEnumerable<MeetModel> 
    } 
} 

Quando provo a passare questo nel mio punto di vista come @model IEnumerable<plantationmvc.Models.CommModel> dice che non esiste nello spazio dei nomi.

+2

Che non può compilare. Qual è il tuo * codice * reale? – Amit

+0

@Amit aggiunto nella vista controller; il frammento di modello è ciò che ho fatto per tentare di aggiungere un secondo modello e modificare il modello 'IEnumerable '. – teachtyler

risposta

7
{ 
public class ArchivesViewModel 
{ 
    public IEnumerable<CommModel> Model1 { get; set; } 
    public IEnumerable<MeetModel> Model2 { get; set; } 
} 

public class CommModel 
{ 
    //properties of CommModel 

} 
public class MeetModel 
{ 
    //properties of Meet Model 
} 

} 

E aggiungere la vista @model plantationmvc.Models.ArchivesViewModel

+0

Dovrei aggiungere il 'public ActionResult Index()' 'var' nelle proprietà CommModel come se fosse un altro controller? e 'return (View)' – teachtyler

+0

è necessario aggiungere solo i dati necessari alla vista indice per viewModel – MstfAsan

+0

Stato occupato ma tornando a guardare questo, quali cambiamenti dovrei apportare al controller? Sposto i dati necessari sul controller sul modello? – teachtyler

2

È necessario qualsiasi tipo per il vostro modello, che ha due collezioni in esso.

Può essere il tipo (ad esempio ArchivesViewModel dalla risposta sopra) oppure è possibile utilizzare anche Tuple<T1, T2>.

Controler:

public ActionResult Index() 
{ 
    var list1 = new[] { "1", "2", "3", "4", "5" }; 
    var list2 = new[] { "10", "20", "30", "40", "50" }; 
    var model = Tuple.Create<IEnumerable<string>, IEnumerable<string>>(list1, list2); 
    return View(model); 
} 

Vista Index.schtml:

@model Tuple<IEnumerable<string>, IEnumerable<string>> 

@foreach (var a in Model.Item1) 
{ 
    <h2>@a</h2> 
} 
@foreach (var b in Model.Item2) 
{ 
    <h3>@b</h3> 
} 
+0

Mentre 'Tuple' sicuramente funzionerebbe personalmente trovo che 'Item1',' Item2', 'ItemX' siano meno utili quando arriva il momento in cui il consumatore della tupla lo utilizza effettivamente. –

+0

Accetto. È meno leggibile. Ma a volte infastidisce che in C# devi creare tipi per ogni compito semplice. Quindi 'Tuple',' Action', 'Func' sono un buon esempio quando puoi usare i tipi .NET e non devi crearne di tuoi. –

+0

Non sono sicuro di cosa sto sbagliando. Come aggiungo ogni set di 'var' al controller. Ho bisogno di ottenere la vista per tornare (file), ma entrambi i set di file. – teachtyler

Problemi correlati