2016-08-17 48 views
0

我需要提交技能列表。當我嘗試做這個提交的模型是空的。但在Fidler中,我發現數據已發送。mvc 5,型號爲List,submited型號爲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; } 
} 

每個技能(對技能等級怪輸入部分觀點是引導星級評價:

@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> 

信息查看技能列表:

@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> 
    } 
} 

和控制器的方法:

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

      return View(); 
     } 

Fidler文本: ID = 1個&名稱= C%2B%2B &類別名稱=編程&級別= 5 & ID = 3 &名稱= PHP &類別名稱=編程&級別= 3 &編號= 6 &名稱= JAVA &類別名稱=編程&等級= 3 &編號= 7 &名稱=名稱&類別名稱=淨+框架&等級= 5

+0

你可以看看[編輯一個可變長度列表,ASP.NET MVC 2樣式](http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list -aspnet-MVC -2-風格/)。他使用NuGet [BeginCollectionItem HtmlHelper](https://www.nuget.org/packages/BeginCollectionItem/)。它設計用於將可變長度列表發佈到另一個MVC控制器操作。 –

+0

你不能使用'foreach'循環爲集合生成表單控件(參考[這個答案](http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943 ) - 你需要爲'MvcSkill'類型定製'EditorTemplate'的'for'循環) –

回答

3

您必須手動添加指標這樣的MVC框架可以成功地將數據綁定。喜歡的東西:

@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> 
} 

或者在註釋中規定可以使用BeginCollectionItem(我個人使用)。 BeginCollectionItem所做的是,通常它會將GUID添加爲您的索引。源代碼可以在here找到,你可以熟悉它here

+0

非常感謝。它有助於 –

+0

@YakovShtykov,我很高興它幫助 –