2016-07-12 40 views
1

Ich habe folgendes Ansichtsmodell:ASP.NET MVC Viewmodel Eigenschaft ist null

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

Die Customer Eigenschaft wird nur ein neues Project an den Kunden zu verbinden, so dass ich nicht enthalten diese Eigenschaft in meinem erstellen Ansicht, die wie folgt aussieht:

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

Wenn ich poste die Form, die folgende Methode in meinem ProjectsController ausgelöst wird:

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

Hier tritt das unerwartete Verhalten auf. Jetzt, wenn ich die vm Eigenschaft untersuche, ist die Customer Eigenschaft null.

Die Frage Wie kann ich die Customer Eigenschaft halten immer noch gefüllt, während sie nicht in der Ansicht verwenden?

+0

Wenn Sie keine Kundeneigenschaftswerte aus der Benutzereingabe lesen, legen Sie dies in Ihrer HttpPost-Aktionsmethode nach Bedarf fest. Möchten Sie einen Dummy-Kunden speichern? – Shyju

Antwort

2

Wenn Sie Ihre Kundendaten beibehalten möchten, müssen Sie alle Felder als ausgeblendete Elemente festlegen, sonst gehen sie in der Weiterleitung verloren.

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

1

Die kurze Antwort ist, dass Sie nicht können. Wenn Daten zurückgesendet werden, sind nur die Daten enthalten, die in der Form auf der HTML-Seite enthalten sind.

Am besten verwenden Sie entweder eine Sitzungsvariable oder suchen die Daten erneut im Post-Handler oder serialisieren die Daten in versteckten Feldern.

0

Um sicherzustellen, dass die Kunden Eigenschaft nie null ist, wenn ProjectViewModel Initialisierung, könnten Sie einen Konstruktor Ihre ProjectViewModel Klasse fügen Sie den Kunden Immobilie an einen new Customer() wie so initialisiert:

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

    public Customer Customer { get; set; } 
} 
Verwandte Themen