2012-03-25 10 views
0

Ich entwickle eine Anwendung in MVC3 mit Nhibernate. Es ist ein Frage-Antwort-Forum, wo auf der ersten Seite die Fragen als Link zusammen mit einem Textfeld unten angezeigt werden, um die Frage einzugeben. Ich habe eine Klasse und eine Mapping-Datei für die gleiche gemacht. Frage Klasse:NHibernate/ASP.NET textarea binding Problem

public class Questions 
{ 
    public virtual int QuestionID { get; set; } 

    [Required] 
    public virtual string Question { get; set; } 

    public virtual int CreatedBy{ get; set; } 

    public virtual DateTime CreatedDate { get; set; } 

    public virtual int ModifiedBy { get; set; } 

    public virtual DateTime ModifiedDate { get; set; } 

    public virtual char Deleted { get; set; } 

    public virtual IList<Answers> Answer { get; set; } 
} 

und dies ist die Mapping-Datei:

[HttpPost] 
    public ActionResult Question_Page(Questions ques, string PostyourQuestion) 
    { 
      ques.Question = PostyourQuestion; 
      ques.CreatedDate = DateTime.Now; 
      ques.ModifiedDate = DateTime.Now; 
      ques.CreatedBy = 101; 
      ques.ModifiedBy = 101; 
      if (ModelState.IsValid) 
      { 
       new QuestionService().SaveOrUpdateQuestions(ques); 
      } 
      return View(new QuestionService().GetAllQuestions()); 
    } 

Innenansicht:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly ="Core" namespace ="Core.Model" > 
<class name ="Questions" > 

<id name="QuestionID"> 
    <generator class="native" /> 
</id> 

<property name="Question"/> 
<property name="CreatedBy" /> 
<property name="CreatedDate" /> 
<property name="ModifiedBy" /> 
<property name="ModifiedDate" /> 
<property name="Deleted"/> 
<bag name="Answer" table="ANSWERS" lazy="true"> 
    <key column="FKQuestionID"/> 
    <one-to-many class="Core.Model.Answers"/> 
</bag> 

Während in der Steuerung Speichern ich dieses wriiten haben

@using (Html.BeginForm("Question_Page","QuestionAnswer",FormMethod.Post)) 
{ 
@Html.ValidationSummary(false) 
<ul> 
@foreach (var item in Model) 
{ 
    <li>@Html.ActionLink(item.Question, "Answer_Page", new { Id = item.QuestionID}) </li> 
} 
    </ul> 

<br /> 
<h2><label for="PostyourQuestion:">Post your Question:</label></h2> 
@Html.TextArea("PostyourQuestion")  
<br /><br /> 
<input type="submit"/> 

}

Nun das Problem ist es nicht den Wert innen „PostyourAnswer“ textarea.even eingegeben spart, wenn der Wert eingeben in it.if i entfernen Sie das gewünschte Attribut es die Daten in der Tabelle speichern wird, aber ich Ich brauche eine Validierung, wenn der Benutzer keine Daten eingibt. Bitte helfen Sie mir dabei.

Antwort

0

Fügen Sie in Ihrem ViewModel/Model ein MultilineText-Attribut hinzu, um die Question-Eigenschaft anzuzeigen, so dass sie als Textbereich gerendert wird wann.

[Required] 
[DataType (DataType.MultilineText)] 
public virtual string Question { get; set; } 

ändern @Html.TextArea("PostyourQuestion")
zu

@Html.EditorFor(m => m.Question) 
+0

hey Aber ich dieses Modell IEnumerable bin mit als meine Modelltyp so gewohnt in der Lage sein, Html.EditorFor (Model.Question) zu verwenden dats yi verwendet Eingabe-Typ – user1274646

+0

Eigentlich muss der EditorFor-Parameter ein Lambda sein: '@ Html.EditorFor (m => m.Question)' –

+0

@esker du hast Recht, aber wie ich oben gesagt habe, benutze ich IEnumerable, also kann ich das nicht benutzen .. kannst du mir einen anderen Weg vorschlagen, dies zu tun !!! – user1274646

0

erstellen "View-Modell" - ein Sonderklasse Eigenschaften halten für Ihre Ansicht benötigt, und dies als Modell Ihrer Ansicht nach ist.

z.

public class AddQuestionViewModel 
{ 
    public List<Question> Questions { get; set; } 

    [Required] 
    [DataType (DataType.MultilineText)] 
    public string QuestionToAsk{ get; set; } 
} 

Dann würde Ihre Ansicht aussehen

@using (Html.BeginForm("Question_Page","QuestionAnswer",FormMethod.Post)) 
{ 
@Html.ValidationSummary(false) 
<ul> 
@foreach (var item in Model) 
{ 
    <li>@Html.ActionLink(item.Question, "Answer_Page", new { Id = item.QuestionID}) </li> 
} 
    </ul> 

<br /> 
<h2><label for="PostyourQuestion:">Post your Question:</label></h2> 
@Html.EditorFor(x => x.QuestionToAsk) 
<br /><br /> 
<input type="submit"/> 

und dem Controller

[HttpPost] 
public ActionResult Question_Page(AddQuestionViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 

     var ques = new Question(); 
     ques.Question = viewModel.QuestionToAsk; 
     ques.CreatedDate = DateTime.Now; 
     ques.ModifiedDate = DateTime.Now; 
     ques.CreatedBy = 101; 
     ques.ModifiedBy = 101; 


     new QuestionService().SaveOrUpdateQuestions(ques); 
    } 
    return View(new QuestionService().GetAllQuestions()); 
}