2012-03-22 14 views
0

定義済みモデルのリストを編集するビューを作成しようとしています。 したがって、モデルのリストをパラメータとして取得する厳密に型指定されたビューです。 私は個々のモデルを編集するためにカスタムHTMLヘルパーを使います。 Getビューは正しく表示されますが、ポストビューモデル(モデルのリスト)は常にnullです。 私はこのトピックについてここに多くの質問があることを知っていますが、私は今これを2日間行っています。編集ビューでコントローラに返されたモデルは常にnullです

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

:これはPrivacyManagerModelのリストを編集しようとした図である

 //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); 
     } 
    } 

:ここ

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



} 

は、コントローラのアクションは、次のとおりです。ここで

は、ベースモデルであります

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

し、最終的にPrivacyManagerModelのHTMLヘルパーEditTemplate:

@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サイトで作業していたときも同様の問題がありました。なぜなら、foreachループを適用し、ループ内の任意の項目のコントロールを作成するときに、 "@ Html.DisplayFor(modelItem => item.PrivaceTypeId)"というMVCプラットフォームがViewの値からモデルを生成することができないからです。 HTMLコントロールに割り当てられたid/nameは "item.PrivaceTypeId"になります。しかし、以下の例では、HTMLコントロールに割り当てられたid/nameは "Model [0] .PrivaceTypeId"、 "Model [1] .PrivaceTypeId"などとなり、Model(collection)ビュー内の値から選択します。

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

私はVSを持っていないので、MVCプラットフォームがエディタテンプレートからモデルを作成できるかどうかはわかりません。確認して見ることができます。しかし、これは確かに私のために働いた4-5回動作します。

+0

私のモデルはIEnumerable <>型で、このモデル "[index]"のような要素にはアクセスできません。 – Martin

+0

あなたのモデルはアレイですか? – Martin

+0

それは今働きます。 IEnumerableの代わりにPrivacyManagerModelの配列を渡すようにコードを変更しました。どうもありがとう!あなたは正しかった – Martin

関連する問題