2015-09-14 17 views
6

Quindi .. ho una classe che ha un List. lo passo alla vista, come il codice qui sotto:Binding IPagedList con checkbox come lista

[HttpGet] 
[Authorize(Roles="user")] 
[CustomChecker] 
public ActionResult Index(int? page, int id=0) 
{ 
    EmployeeContext emp = new EmployeeContext(); 
    student st = emp.students.Single(x=>x.id ==id); 

    @ViewBag.id = st.id; 

    return View(st.subjSel.ToPagedList(page ?? 1, 4)); 
} 

E poi la vista riceverà in questo modo:

@using PagedList; 
@using PagedList.Mvc; 
@model PagedList<MvcApplication6.Models.subject> 
<div style="font-family:Arial"> 
    <fieldset> 
     <legend><h3>Open Classes</h3></legend> 
     @using (Html.BeginForm("Test", "Enrollment")) 
     { 
      <input type="hidden" name="id" value="@ViewBag.id" /> 
      <table border="1"> 
       <tr> 
        <th>@Html.LabelFor(model => model[0].subj)</th> 
        <th>@Html.LabelFor(model => model[0].days)</th> 
        <th>@Html.LabelFor(model => model[0].cstart)</th> 
        <th>@Html.LabelFor(model => model[0].cend)</th> 
        <th>@Html.LabelFor(model => model[0].professor)</th> 
        <th>@Html.LabelFor(model => model[0].units)</th> 
        <th>@Html.CheckBox("test") Select all</th> 
       </tr> 
       @for (int i = 0; i < Model.Count; i++) 
       { 
        <tr> 
         @Html.HiddenFor(model => model[i].id) 
         <td> 
          @Html.DisplayFor(m => m[i].subj) 
          @Html.HiddenFor(m => m[i].subj) 
         </td> 
         <td> 
          @Html.DisplayFor(m => m[i].days) 
          @Html.HiddenFor(m => m[i].days) 
         </td> 
         <td> 
          @Html.DisplayFor(m => m[i].cstart) 
          @Html.HiddenFor(m => m[i].cstart) 
         </td> 
         <td> 
          @Html.DisplayFor(m => m[i].cend) 
          @Html.HiddenFor(m => m[i].cend) 
         </td> 
         <td> 
          @Html.DisplayFor(m => m[i].professor) 
          @Html.HiddenFor(m => m[i].professor) 
         </td> 
         <td> 
          @Html.DisplayFor(m => m[i].units) 
          @Html.HiddenFor(m => m[i].units) 
         </td> 
         <td> 
          @Html.CheckBoxFor(m => m[i].isSelected) 
         </td> 
        </tr> 
       } 
      </table> 
      <br /> 
      <br /> 
      <table> 
       <tr><td align="center" width="500px"></td></tr> 
       <tr> 
        <td align="center" width="500px"> 
         <input type="submit" value="submit" /> | <input type="button" value="clear" /> 
        </td> 
       </tr> 
      </table> 
      <br /> 
      <br /> 
     } 
    </fieldset> 
</div> 
@Html.PagedListPager(Model, page => Url.Action("Index", "Enrollment", new { page, id = Request.QueryString["id"] })) 

Il mio problema è che sarà reso in questo modo [0].subj e che ha vinto Mi permettono di legare perché dovrebbe essere qualcosa come name[0].subj.

Ho sperimentato e provato nuovi metodi, ci sono modi per legarli correttamente? Voglio usare Html Helpers e per quanto possibile, non voglio ri-implementare uno personalizzato solo per questa parte.

Questa è la funzione in cui dovrebbero essere associati. Questa classe ha un List di studenti (quella che mi sono convertito al IPagedList)

[HttpPost] 
[Authorize(Roles="user")] 
public ActionResult Test(student st) 

Ed è così che il mio View assomiglia. Sto usando CheckBoxFor per le selezioni. enter image description here

domanda Extra: Come mai la mia navigazione sembra così brutto?

+0

È e dovrebbe essere '[0] .subj' (non' nome [0] .subj') perché il modello è ' PagedList '' non 'studente', il che significa che il metodo POST deve essere' IEnumerable 'non' studente'. In alternativa, se si desidera 'studente' nel metodo POST, il modello nella vista deve essere' studente'. –

+0

Ma non generate alcun controllo per 'student' in ogni caso (eccetto per la proprietà' id') in modo che possa essere facilmente aggiunto come valore di route in modo da averlo nel metodo POST –

+0

Quindi se è '[0] .subj' allora dovrebbe essere 'IEnumerable '? –

risposta

1

Il modello è la vista è @model PagedList<subject> che significa che il parametro nella deve essere

[HttpPost] 
public ActionResult Test(IEnumerable<subject> model) 

Se hai bisogno anche la proprietà studente ID, quindi includere un parametro aggiuntivo

[HttpPost] 
public ActionResult Test(IEnumerable<subject> model, int ID) 

dato che si ottiene metodo ha un parametro int ID e supponendo che si utilizzi il routing predefinito, l'ID verrà aggiunto all'attributo moduli action, vale a dire che renderà action="/Enrollment/Test/2" assumendo il valore di I D è 2. In caso contrario, è possibile aggiungere questo come un parametro di percorso

@using (Html.BeginForm("Test", "Enrollment", new { ID = ViewBag.id })) 

In alternativa è possibile utilizzare un modello di vista

public class StudentVM 
{ 
    public int ID { get; set; } 
    public PagedList<student> Students { get; set; } 
} 

e nel metodo GET

public ActionResult Index(int? page, int id=0) 
{ 
    EmployeeContext emp = new EmployeeContext(); 
    student st = emp.students.Single(x=>x.id ==id); 
    StudentVM model = new StudentVM() 
    { 
    ID = id, 
    Students = st.subjSel.ToPagedList(page ?? 1, 4) 
    }; 
    return View(model); 
} 

e la base a visualizzare sul visualizza il modello e pubblicalo su public ActionResult Test(StudentVM model)

+0

questo praticamente lo ha fatto, grazie mille. –

+0

Fuori tema, pensi che sia possibile mantenere lo stato delle caselle di controllo (che dovrebbero essere incluse anche se le ho passate al mio post anche se non sono mostrate ex. Controllo qualcosa dalla pagina 1 poi spostato) che è la prossima fase a cui sto lavorando. Ho la sensazione che ho bisogno di rielaborare sul mio modello poiché il mio modello ha 'list' e non' PageList'. Li ho appena convertiti –

+0

Non completamente sicuro di quello che stai chiedendo. I valori di 'isSelected' verranno postati. Se intendi che ne controlli un po 'su una pagina poi vai alla pagina successiva, allora dovrai mantenere i valori da qualche parte (ad esempio alla Sessione) –

1

Per ottenere l'elenco di subject indietro, è necessario applicare un prefisso adatto ad esso. Dal momento che il nome di proprietà di Student che contiene List<subject> è subjSel e si desidera ottenere i valori nella vostra azione in un oggetto Student, così si dovrebbe impostare il prefisso in questo modo, prima di for dichiarazione:

@{ViewData.TemplateInfo.HtmlFieldPrefix = "subjSel";} 

Così Campi di modello sarà essere reso con nomi come subjSel[0].fieldname.

Quindi nella tua azione post riceverai i soggetti in subjSel di proprietà st.

risorse aggiuntive:

per la tua domanda in più:

Verificare se il codice reso ha stile adatto e che le tag legati agli stili di paging è stato reso nella pagina.

+0

Quindi ho solo bisogno di inserire quel codice? –

+0

Come vedo nel tuo codice, penso che questa sia l'unica modifica –

+0

Stranamente, viene visualizzato come 'subjSel. [0] .subj' –

Problemi correlati