2015-06-22 2 views
2

Я новичок в MVC ASP и нуждаюсь в вашей помощи. Я хотел бы передать список с точки зрения контроллера, но каждый раз, когда я отправляю свою форму, список пуст (null) в контроллере.MVC 4 Передача списка с точки зрения контроллера

Вот моя модель:

namespace ArcheryComp.Models 
    { 
    [MetadataType(typeof(Participe))] 
    public class Participe 
    { 

     [Required] 
     [Display(Name = "Id Archer")] 
     public int idArcher { get; set; } 
     [Required] 
     [Display(Name = "Id Tournoi")] 
     public int IdTournament { get; set; } 
     [Required] 
     [Display(Name = "Division")] 
     public int division { get; set; } 
     [Required] 
     [Display(Name = "Categorie")] 
     public string categorie { get; set; } 
     [Required] 
     [Display(Name = "Score 1")] 
     public int ArchScore1 { get; set; } 

     [Display(Name = "X")] 
     public int ArchScore1_X_6 { get; set; } 

     [Display(Name = "10")] 
     public int ArchScore1_10_5 { get; set; } 
     [Required] 
     [Display(Name = "Score 2")] 
     public int ArchScore2 { get; set; } 

     [Display(Name = "X")] 
     public int ArchScore2_X_6 { get; set; } 

     [Display(Name = "10")] 
     public int ArchScore2_10_5 { get; set; } 
     [Required] 
     [Display(Name = "Total")] 
     public int ArchTotalScore { get; set; } 

     [Display(Name = "Total X")] 
     public int ArchTotalScore_X_6 { get; set; } 

     [Display(Name = "Total 10")] 
     public int ArchTotalScore_10_5 { get; set; } 

     public List<Participe> liste { get; set; } 
    } 
    } 

Вот мой контроллер:

namespace ArcheryComp.Controllers 
    { 
    public class ParticipeController : Controller 
    { 
     private ArcheryCompEntities db = new ArcheryCompEntities(); 
     ...... 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult EncodeResult(IList<Participe> parti) 

     { 

      foreach (Participe item in parti) 
      { 


       var data = from part in db.Participe 
          where part.IdArcher == item.IdArcher && part.IdTournament == item.IdTournament 
          select part;      

       item.ArchScore1 = item.ArchScore1; 
       item.ArchScore2 = item.ArchScore2; 
       item.ArchTotalScore = item.ArchTotalScore; 
      } 

А вот мое мнение:

@model List<ArcheryComp.Participe> 

    @{ 
    ViewBag.Title = "EncodeResult"; 
    } 


    <h2>Encoder Resultats</h2> 


    @using (Html.BeginForm("EncodeResult","Participe",FormMethod.Post)) 
    { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(false) 
    <table> 
     <tr> 
      <th> 
       @Html.LabelFor(model => Model[0].Archers.Nom) 
      </th> 
      <th> 
       @Html.LabelFor(model => Model[0].Archers.Prenom) 
      </th> 
      <th> 
       @Html.LabelFor(model => Model[0].Divisions.DivDescription) 
      </th> 
      <th> 
       @Html.LabelFor(model => Model[0].Categorie) 
      </th> 
      <th> 
       @Html.LabelFor(model => Model[0].ArchScore1, new {style = "width: 10px;"}) 
      </th> 
      <th> 
       @Html.LabelFor(model => Model[0].ArchScore2, new {style = "width: 10px;"}) 
      </th> 
      <th> 
       @Html.LabelFor(model => Model[0].ArchTotalScore, new {style = "width: 10px;"}) 
      </th> 
     </tr> 
     @for(int i = 0; i < Model.Count() ; i++) 
     { 
      <tr> 
       <td>           
        @Html.TextBox("archers["[email protected]+"].IdArcher", Model[i].Archers.Nom) 
        @Html.ValidationMessageFor(x => x[i].IdArcher) 
       </td> 
       <td> 
        @Html.TextBox("archers["[email protected]+"].Prenom", Model[i].Archers.Prenom) 
       </td> 
       <td> 
        @Html.TextBox("archers["[email protected]+"].Division", Model[i].Divisions.DivDescription) 
        @Html.ValidationMessageFor(x => x[i].Divisions.Id) 

       </td> 
       <td> 
        @Html.TextBox("archers["[email protected]+"].Categorie", Model[i].Categorie) 
        @Html.ValidationMessageFor(x => x[i].Categorie) 
       </td> 
       <td> 
        @Html.TextBox("suma["[email protected]+"]", Model[i].ArchScore1, new{ @onchange = "updatesum()"}) 
        @Html.ValidationMessageFor(x => x[i].ArchScore1) 
       </td> 
       <td>> 
        @Html.TextBox("sumb["[email protected]+"]", Model[i].ArchScore2, new { @onchange = "updatesum()" }) 
        @Html.ValidationMessageFor(x => x[i].ArchScore2) 
       </td> 
       <td> 
        @Html.TextBox("sumt["[email protected]+"]", Model[i].ArchTotalScore, new { @onchange = "updatesum()" }) 
        @Html.ValidationMessageFor(x => x[i].ArchTotalScore) 
       </td> 
      </tr> 
     } 

    </table> 
    <p> 
     <input type="submit" value="Save" /> 
    </p> 
    } 

Можете ли вы помочь разобраться в этом? Большое спасибо заранее !!!

+0

Является ли ваш метод действий получающим список со стороны клиента? если да, то можете ли вы поделиться клиентским кодом, который отправляет список

+0

, вы не можете получить такую ​​коллекцию, как список в простых сообщениях формы. вам нужно написать код jquery/javascript, который будет готовить объект коллекции на стороне клиента и отправлять его на сервер. Вы можете добавить свой отзыв. http://webcognoscere.com/post/How-to-POST-a-JSON-object-to-a-Controller-Action.aspx –

+0

@Tanzeel, конечно же вы можете разместить коллекцию !. –

ответ

2

Ваше использование @Html.TextBox(), в котором вы вводите имя, которое не имеет отношения к вашим свойствам модели и означает, что вы не можете привязываться к коллекции при отправке.

Например у вас есть свойство string categorie, что означает, что имя входа будет нужно быть name="[0].categorie, но вы создаете вход с name="archers[0].Categorie». Всегда используйте сильно типизированных HTML помощника (как вы сделали с ValidationMessageFor()

@Html.TextBoxFor(x => x[i].Categorie) 
@Html.ValidationMessageFor(x => x[i].Categorie) 

Side Примечание: В заголовках таблицы должно быть

<td>@Html.DisplayNameFor(m => m.Categorie)</td> 

не @Html.LabelFor()<label> является HTML доступность Elemen. t - нажатие на нее устанавливает фокус на связанный элемент управления, который в этом случае не имеет смысла, поскольку у вас есть таблица, содержащая несколько элементов управления для каждого свойства.

+0

Я не думаю, что простая форма post/submit может быть получена на стороне сервера в виде списка. он нуждается в представленном представлении в виде списка участия. –

+0

Конечно, может. Пока элементы управления формы правильно названы, вы можете привязываться ко всему. Это в этом случае его «Список », поэтому элементам управления должно быть «name =» [0]. Категоризация «', 'name =" [1] .Категория "', 'name =" [2] .Категория "' и т. Д. (и для других имен свойств) –

+0

Спасибо. получил идею. –

0

Я получил его, и он работает спасибо :) Тем не менее у меня есть еще маленький вопрос, я использую следующий (updatesum()) JavaScript для динамического расчета в поле сумму баллов лучника на мой взгляд:

<td> 
        @Html.TextBox("suma["[email protected]+"]", Model[i].ArchScore1, new{ @onchange = "updatesum()"}) 
        @Html.ValidationMessageFor(x => x[i].ArchScore1) 
       </td> 
       <td>> 
        @Html.TextBox("sumb["[email protected]+"]", Model[i].ArchScore2, new { @onchange = "updatesum()" }) 
        @Html.ValidationMessageFor(x => x[i].ArchScore2) 
       </td> 
       <td> 
        @Html.TextBox("sumt["[email protected]+"]", Model[i].ArchTot`enter code here`alScore, new { @onchange = "updatesum()" }) 
        @Html.TextBoxFor(x=>x[i].ArchTotalScore) 
        @Html.ValidationMessageFor(x => x[i].ArchTotalScore) 
       </td> 

<script type="text/javascript"> 
     function updatesum() { 
      for (i = 0; i < 15; i++) { 
       var sua = "suma_" + i + "_"; 
       var sub = "sumb_" + i + "_"; 
       var sut = "sumt_" + i + "_"; 
       suma = document.getElementById(sua).value; 
       sumb = document.getElementById(sub).value; 
       sum = (suma - 0) + (sumb - 0); 
       document.getElementById(sut).value = sum; 
      } 

     } 

    </script> 

Знаете ли вы, можно ли добавить результат этой функции javascript в TextBoxFor?