2016-08-15 1 views
0

Ich studiere derzeit objektorientierte Programmierung (OOP) in C# und kürzlich sah, dass Zusammensetzung aufgrund der Flexibilität gegenüber Vererbung bevorzugt ist. Wie auch immer, ich bin gerade auf Lager.Meine Klasse wird leer auf Formularpost in ASP.NET MVC

Ich habe 2 Klasse (Student and Assessment)

public class Student 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class SkillsAssessment 
{ 
    public readonly Student Student = new Student(); 

    [Required] 
    public string Industry { get; set; } 
    [Required] 
    public string YearsInIndustry { get; set; } 
} 

ich ein Rasiermesser Ansicht StudentDetails.cshtml haben

@Html.TextBoxFor(x => x.Student.FirstName, htmlAttributes: new { @class = "form-control input-lg", @required = "required" }) 
@Html.TextBoxFor(x => x.Student.LastName, htmlAttributes: new { @class = "form-control input-lg", @required = "required" }) 
@Html.TextBoxFor(x => x.Industry, htmlAttributes: new { @class = "form-control input-lg", @required = "required" }) 
@Html.TextBoxFor(x => x.YearsInIndustry, htmlAttributes: new { @class = "form-control input-lg", @required = "required" }) 

Und in meinem Controller-

Public ActionResult(SkillsAssessment data){ 
    //This is where the problem comes 
    //Because the Student Class inside my SkillsAssessment is always null 
    //And all I can get is the Industry and YearsInIndustry field 
} 

Ich hoffe, Sie können helfen Sie mir, herauszufinden, wie Sie das beheben können, und geben Sie mir ein klares Verständnis über meine Implementierung mit Composition.

+0

Es muss eine Eigenschaft, kein Feld sein - 'public Student Student {get; einstellen; } '(Randnotiz: Entfernen Sie' @ erforderlich = "erforderlich" 'und verwenden Sie' @ Html.ValidationMessageFor (...) ') –

+0

@StephenMuecke Hallo Sir, ich entschuldige mich, wenn dies eine doppelte Frage ist, können Sie mir bitte den Link senden von dem anderen? Auch deine Lösung für mein Problem funktioniert tatsächlich, obwohl ich nicht wirklich mit dem Thema verwechselt werde, dass ich die Komposition über die Vererbung gesehen habe. Ich dachte, ich mache die Komposition richtig. – jmaghuyop

+0

Was meinst du mit _link des anderen_? (auf welches andere beziehen Sie sich?) –

Antwort

0

In ein Modell zur Ansicht Überschrift @model Studenten

machen und entfernen das readonly von der Initialisierung von th e Klasse

public class SkillsAssessment {

public Student _student {get;set;} 
[Required] 
public string Industry { get; set; } 
[Required] 
public string YearsInIndustry { get; set; } 

}

dann die Klasse Student in Ihrer Aktion initialisieren, bevor es zu der Ansicht zu senden.

+0

Yup, ich habe bereits ein @ Model in meiner Ansicht, deshalb kann ich den Wert von Industry und YearsInIndustry Feld nur für die Felder innerhalb der Studentenklasse erhalten. Ursache, wenn der Code an den Controller geht die Schüler-Klasse neu initialisiert wird, weshalb es wieder leer wird. Ich weiß nicht, wie ich es lösen soll. – jmaghuyop

+0

@jmaghuyop Bitte überprüfen Sie die Antwort Ich habe es aktualisiert – wandos

+0

Ich habe dieses Problem bereits mit der, die Sie vorschlagen, ich bin nur neugierig, ob es immer noch folgt der Komposition Design in objektorientierte Programmierung oder nicht? – jmaghuyop

0

Statt:

public readonly Student Student = new Student(); 

Verwenden

public Student Student = new Student(); 

readonly ist Ihr Eigentum nicht editierbares

+0

Ich habe bereits versucht, readonly zu verwenden, und das von Ihnen vorgeschlagene funktioniert immer noch nicht. Wenn der Code an den Controller geht, wird die Student-Klasse neu initialisiert, weshalb sie wieder leer wird. Ich weiß nicht, wie ich es lösen soll. – jmaghuyop