2016-08-17 9 views
0

Ich muss Liste der Fähigkeiten vorlegen. Wenn ich versuche, dieses eingereichte Modell zu machen, ist null. Aber in Fidler sehe ich, dass Daten gesendet wurden.mvc 5, Modell ist Liste, eingereicht Modell ist Null

public class MvcSkill 
{ 
    [HiddenInput(DisplayValue = false)] 
    public int Id { get; set; } 

    [Display(Name = "Category Name")] 
    [StringLength(128, ErrorMessage = "Max length - {0} symbols")] 
    [Required(ErrorMessage = "Please enter your last name")] 
    public string Name { get; set; } 

    public int Level { get; set; } 

    [Required(ErrorMessage ="Choose skill category")] 
    public string CategoryName { get; set; } 
} 

Teilansicht für jede Fähigkeit (seltsam Eingang für Skill-Level ist Bootstrap-Sterne-Bewertung:

@using MvcApp.Infrastructure; 
@model MvcApp.ViewModels.MvcSkill 

<tr> 
    <td> 
     @Html.HiddenFor(x => x.Id) 
    </td> 
    <td> 
     @Html.HiddenFor(x => x.Name) 
     @Html.DisplayFor(x => x.Name) 
    </td> 
    <td> 
     @Html.HiddenFor(x => x.CategoryName) 
     @Html.DisplayFor(x => x.CategoryName) 
    </td> 
    <td> 
     <input for="Level" id="@Model.Id" value="@Model.Level" name="Level" type="number" class="rating-loading" data-size="xs" data-min="0" data-max="5" data-step="1" data-show-clear="false"> 
    </td> 

    @{ 
     var identity = (CustomIdentity)User.Identity; 

     if (identity.Roles.FirstOrDefault(r => r == "Administrator") != null) 
     { 
      <td> 
       @Html.RouteLink("Edit", new { controller = "Administrator", action = "EditSkill", id = Model.Id }) 
      </td> 
      <td> 
       @Html.RouteLink("Remove", new { controller = "Administrator", action = "RemoveSkill", id = Model.Id }) 
      </td> 
     } 
    } 
</tr> 

Ansicht für die Liste der Fähigkeiten:

@model IList<MvcApp.ViewModels.MvcSkill> 

@{ 
    ViewBag.Title = "Skills"; 
} 
@using (Html.BeginForm("Index","Skill", Model)) 
{ 
    <table> 
     @foreach (var s in Model) 
     { 
      @Html.Partial("_Skill", s) 
     } 
    </table> 

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input id="submit" type="submit" value="Update" class="btn btn-default" /> 
     </div> 
    </div> 
} 

@section scripts{ 
    <link href="http://netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" rel="stylesheet"> 
    <link href="~/Content/star-rating.css" media="all" rel="stylesheet" type="text/css" /> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.js"></script> 
    <script src="~/Scripts/star-rating.js" type="text/javascript"></script> 
    @foreach (var item in Model) 
    { 
     string id = item.Id.ToString(); 
     <script> 
      $(document).on('ready', function() { 
       $('#@id').rating({ 
        step: 1, 
        defaultCaption: 'Unknown', 
        starCaptions: { 0: 'Unknown', 1: 'Beginner', 2: 'Elementary', 3: 'Intermediate', 4: 'Advanced', 5: 'Profi' }, 
        starCaptionClasses: function (val) { return 'text-success'; } 
       }).on('rating.change', function (event, value, caption) { 
        Model.Skills.FirstOrDefault(s => s.Key.Id.ToString() == id).Value = value; 
       }); 
      });    
     </script> 
    } 
} 

und Controller-Methode:

[HttpPost] 
     public ActionResult Index(List<MvcSkill> skillModel) 
     { 
      //Do something... 

      return View(); 
     } 

Fidler text: ID = 1 & Name = C% 2B% 2B & Kategorie = Programing & Stufe = 5 & Id = 3 & Name = PHP & Kategorie = Programing & Stufe = 3 & Id = 6 & Name = JAVA & Kategorie = Programing & Stufe = 3 & Id = 7 & Name = Name des & Kategorie = Net + Frameworks & Ebene = 5

+0

Sie können [Bearbeiten einer Liste variabler Länge, ASP.NET MVC 2-style] (http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list) -aspnet-mvc-2-style /). Er verwendet das NuGet [BeginCollectionItem HtmlHelper] (https://www.nuget.org/packages/BeginCollectionItem/). Es wurde entwickelt, um Listen variabler Länge zu einer anderen MVC-Controller-Aktion zu senden. –

+0

Sie können keine foreach-Schleife verwenden, um Formularsteuerelemente für eine Sammlung zu generieren (siehe [diese Antwort] (http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943)) - Sie brauchen eine 'for' Schleife von benutzerdefiniertem' EditorTemplate' für typeof 'MvcSkill') –

Antwort

3

Sie haben manuell Indizes hinzufügen so MVC-Framework erfolgreich Daten binden. Etwas wie:

@using (Html.BeginForm("Index","Skill", Model)) 
{ 
    <table> 
     @for (int i = 0; i < Model.Length; i++) 
     { 
      <tr> 
       <td> 
        @Html.Hidden("[" + i + "].Id"); 
       </td>    
       <td> 
        @Html.DisplayFor(m => Model.ElementAt(i).Name) 
        @Html.Hidden("[" + i + "].Name"); 
       </td> 
       <td> 
        @Html.DisplayFor(m => Model.ElementAt(i).CategoryName) 
        @Html.Hidden("[" + i + "].CategoryName"); 
       </td> 
      </tr> 
     } 
    </table> 
} 

Oder wie in den Kommentaren angegeben Sie BeginCollectionItem verwenden können (was ich persönlich verwenden). Was BeginCollectionItem tut, ist in der Regel fügt GUIDs als Index für Sie hinzu. Quellcode kann here gefunden werden und Sie können sich damit vertraut machen here.

+0

Vielen Dank. Es hilft –

+0

@YakovShtykov, ich bin froh, dass es geholfen hat –