2012-03-22 68 views
0

我試圖製作一個編輯預定義模型列表的視圖。 因此,它是一個強類型視圖,它以參數爲模型列表。 我使用自定義的Html助手來編輯單個模型。 Get視圖顯示正常,但後發佈視圖模型(模型列表)始終爲空。 我知道這裏有很多關於這個話題的問題,但我一直試圖做這個爲期2天。通過編輯視圖返回給控制器的模型始終爲空

這是基礎型號:

public class PrivacyManagerModel 
{ 
    [Required] 
    [Display(Name="Privacy Type Id")] 
    public int PrivaceTypeId { get; set; } 

    [Required] 
    [Display(Name = "Visibility Level Id")] 
    public int VisibilityLevelId { get; set; } 



} 

這裏是控制器動作:

 //GET: /Profile/ManagePrivacy 
    [Authorize] 
    public ActionResult ManagePrivacy() 
    { 
     PrivacyTypeService _privacyTypeService=new PrivacyTypeService(); 
     IEnumerable<PrivacyFlagType> privacyTypes = _privacyTypeService.GetPrivacyFlagTypes(); 
     List<PrivacyManagerModel> model=new List<PrivacyManagerModel>(); 
     foreach (PrivacyFlagType type in privacyTypes) 
     { 
      PrivacyManagerModel temp=new PrivacyManagerModel(); 
      temp.PrivaceTypeId=type.PrivacyFlagTypeId; 
      model.Add(temp); 
     } 


     ViewBag.privacyTypes=privacyTypes; 



     return View(model); 
    } 

    //POST: /Profile/ManagePrivacy 
    [Authorize] 
    [HttpPost] 
    public ActionResult ManagePrivacy(IEnumerable<PrivacyManagerModel> model) 
    { 

     if (ModelState.IsValid) 
     { 
     do stuff 
     } 
     else 
     { 
      return View(model); 
     } 
    } 

這是試圖編輯的PrivacyManagerModel列表視圖:

@model IEnumerable<Klever.PrivacyManagerModel> 
@using Klever 
@{ 
ViewBag.Title = "ManagePrivacy"; 
var _privacyTypes = ViewBag.privacyTypes as IEnumerable<PrivacyFlagType>; 
} 

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<fieldset> 

    @foreach(PrivacyManagerModel item in Model) 
    { 
     <div class="display-label"> 
     @Html.DisplayFor(modelItem=>item.PrivaceTypeId) 
     </div> 
     <div class="editor-field"> 
     @Html.EditorFor(modelItem=>item) 
     </div> 
     } 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

<div> 
@Html.ActionLink("Back to List", "Index") 
</div> 

終於HTML輔助EditTemplate爲PrivacyManagerModel

@model Klever.PrivacyManagerModel 
@using Klever.Components 
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@{ 
PrivacyTypeService _privacyService = new PrivacyTypeService(); 
var visibilityLevels=_privacyService.GetVisibilityLevels(); 

} 
<fieldset> 


    <div class="editor-label"> 
     @Html.LabelFor(model => model.PrivaceTypeId) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model=>model.VisibilityLevelId,new SelectList(visibilityLevels,"VisibilityLevelId","Name")) 
     @Html.ValidationMessageFor(model => model.VisibilityLevelId) 
    </div> 
    </fieldset> 

同樣,GET行動工作正常(它顯示了正確的觀點),但郵政操作始終接收一個空模型參數。 我將不勝感激您的幫助。 謝謝

回答

1

你可以試試這個。當我在一個項目中使用MVC 3網站時,我遇到了類似的問題。原因在於MVC平臺無法從視圖中的值生成模型,因爲當我們將foreach循環應用於循環中的任何項目並創建控件時,就像「@ Html.DisplayFor(modelItem => item.PrivaceTypeId) 「分配給HTML控件的id/name將是」item.PrivaceTypeId「。但是在下面給出的例子中,分配給HTML控件的id/name應該是「Model [0] .PrivaceTypeId」,「Model [1] .PrivaceTypeId」等等......這將有助於創建Model(集合)從視圖中的值。

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<fieldset> 

    @for(int i = 0; i <= Model.Count; i++) 
    { 
     <div class="display-label"> 
     @Html.DisplayFor(modelItem=>Model[i].PrivaceTypeId) 
     </div> 
     <div class="editor-field"> 
     @Html.EditorFor(modelItem=>Model[i]) 
     </div> 
    } 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

我不知道,如果MVC平臺將能夠創建編輯模板的模型,因爲我沒有VS現在。你可以查看並看到。但是這肯定會起作用,因爲它已經爲我工作了4-5次。

+0

我明白你的意思,但我的模型是IEnumerable <>類型的,我不能訪問像這樣的「Model。[index]」元素。 – Martin 2012-03-22 12:02:25

+0

你的模型是一個數組嗎? – Martin 2012-03-22 12:02:39

+0

好了,現在可以使用。我改變了代碼來傳遞一個PrivacyManagerModel數組,而不是IEnumerable。非常感謝!你是對的 – Martin 2012-03-22 12:20:43