2016-07-12 19 views
1

I次のViewModelを持っている:ASP.NET MVCのViewModelプロパティはnullです

public class ProjectViewModel 
{ 
    public Project Project { get; set; } 
    public Customer Customer { get; set; } 
} 

Customerプロパティは、お客様に新しいProjectをリンクするために使用されたので、私は私の作成中にこのプロパティが含まれていませんこのように見えるビュー、:私はフォームを投稿すると

@using (Html.BeginForm()) 
{ 
@Html.AntiForgeryToken() 

<div class="form-horizontal"> 
    <h4>Project</h4> 
    <hr /> 
    @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
    <div class="form-group"> 
     @Html.LabelFor(model => model.Project.Name, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Project.Name, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.Project.Name, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

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

、私のProjectsControllerに次のメソッドがトリガーされます。

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "Project,Customer")] ProjectViewModel vm) 
{ 
    var project = Mapper.Map<Project>(vm); 
    if (ModelState.IsValid) 
    { 
     _db.Create(project); 
     return RedirectToAction("Index"); 
    } 
    return View(vm); 
} 

これは予期しない動作が発生する場所です。今、vmプロパティを調べると、Customerプロパティはnullです。

質問 ビューでそれを使用していないながら、どのように私はまだ、満たされたCustomerプロパティを保つことができますか?

+0

ユーザー入力から得意先のプロパティ値を読み取っていない場合は、必要に応じてHttpPostアクションメソッドでそれを設定しないでください。ダミーの顧客を救うつもりですか? – Shyju

答えて

2

顧客データを保持する場合は、すべてのフィールドを非表示の要素として設定する必要があります。そうしないと、リダイレクトで失われます。

@Html.HiddenFor(model => model.Customer.Property1) ...etc...

1

短い答えは、あなたができないということです。データがポストバックされると、HTMLページのフォームに含まれているデータのみが含まれます。

セッション変数を使用するか、ポストハンドラでデータを再度参照するか、データを隠しフィールドにシリアル化することをお勧めします。

0

ProjectViewModelを初期化するときお客様プロパティがnullにはならないであることを確認するには、あなたはとても似new Customer()カスタマープロパティを初期化し、あなたのProjectViewModelクラスにコンストラクタを追加することができます。

public class ProjectViewModel 
{ 
    // Constructor 
    public ProjectViewModel() 
    { 
     Customer = new Customer(); 
    } 

    public Customer Customer { get; set; } 
} 
関連する問題