2012-03-25 6 views
0

zu behalten Ich entwickle eine Anwendung in MVC mit Nhibibernate. Es ist ein Frage-Antwort-Forum, wo auf der ersten Seite eine Liste von Fragen als Link angezeigt wird. Jetzt, wenn ich auf den Link klicke, bewegt es sich auf die Antworten-Seite, wo die Antworten für die jeweilige Frage angezeigt werden. Ich habe zwei Tabellen mit den folgenden FeldernUm einen Wert in einer Variablen bis nach der Aktion in MVC3

Frage Tabelle:

QuestionID int 
Question nvarchar(255) 
Created_Date datetime 
Modified_Date datetime 
Created_By int 
Modified_By int 
Deleted nchar(1) 

Antworten Tabelle:

AnswerId int 
Answer nvarchar(255) 
Created_Date datetime 
Modified_Date datetime 
Created_By int 
Modified_By int 
QuestionID int (foreign key) 
Deleted nchar(1) 

Dies ist, was ich versucht habe: Innen QuestionPage.cshtml

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

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

}

Innerhalb des Controller:

public ActionResult Answer_Page(int Id, string Question) 
    { 
     var model = new AnswerService().GetAllAnswers(); 
     ViewBag.Question = Question; 
     model = (from x in model 
       where x.QuestionID.Equals(Id) 
       select x).ToList(); 

     return View(model); 
    } 
    [HttpPost] 
    public ActionResult Answer_Page(Answers ans, string PostyourAnswer, int Id,string Question) 
    { 
     ViewBag.Question =Question; 
     ans.Answer = PostyourAnswer; 
     ans.CreatedDate = DateTime.Now; 
     ans.ModifiedDate = DateTime.Now; 
     ans.CreatedBy = 101; 
     ans.ModifiedBy = 101; 
     ans.FkQuestionID= Id; 
     if (ModelState.IsValid) 
     { 
      new AnswerService().SaveOrUpdateAnswers(ans); 
      var model = new AnswerService().GetAllAnswers(); 
      model = (from x in model 
        where x.QuestionID.Equals(Id) 
        select x).ToList(); 
      return View(model); 
     } 

     return View(); 
    } 

Aber das Problem ist OnPost i einen Nullwert in der Frage Variable erhalten und somit in der Lage, ich bin nicht die Frage auf Beitrag anzuzeigen, wenn der Benutzer das Formular abschickt. Bitte helfen me.I weiß, dass ich dumm sumthing bin fehlt ..

Antwort

0

versuchen auf sich ändernde

@Html.ActionLink(item.Question, "Answer_Page","QuestionAnswer", new { @Id = item.QuestionID, @Question = item.Question },null) 

Jetzt sollten Sie in der Lage sein, es in der Frage Variable zu erhalten.

Persönlich glaube ich nicht, dass es eine gute Idee ist, die Frage zu übergeben, wie es in der Abfragezeichenfolge ist. Der Abfrage-String hat eine begrenzte Anzahl an Zeichen, glaube ich. Sie sollten idealerweise nur die Fragen-ID übergeben und das Frageobjekt erneut in Ihrer Aktionsmethode erstellen, indem Sie Ihre persistente Datenquelle abfragen.

What is the maximum possible length of a query string?

http://classicasp.aspfaq.com/forms/what-is-the-limit-on-querystring/get/url-parameters.html

+0

Hallo, danke 4 d Antwort..aber ich bin neu zu mvc können Sie mir zeigen, wie eine Abfrage in der Steuerung abzufeuern, um nur den Wert gleich dem Id-Wert – user1274646

+0

hey Kumpy thanx 4 die Idee zu holen. .I hat es..Ich habe eine Abfrage innerhalb des Controllers ausgelöst und bin in der Lage, den Wert zu holen. – user1274646

+0

@ user1274646 Ich weiß nichts über Ihre Tabellen. Versuchen Sie, die Abfrage zu kopieren, die Ihnen alle Fragen auf der Hauptseite gibt, und fügen Sie eine Where-Bedingung für die Frage-ID hinzu (wo QuestionId = id) – Shyju

0

Es gibt ein paar Möglichkeiten, dies zu umgehen. Der beste Weg, IMO, besteht darin, die Frage-ID in die URL zu codieren und die Frage von Ihrem Repository erneut zu bekommen. Implementieren Sie das Caching in Ihrem Repository oder als eine Ebene, die Ihr Repository umschließt, wenn mehr Leistung benötigt wird. Die andere Möglichkeit besteht darin, TempData (im Wesentlichen die Session) zu verwenden, um die Daten über einen Anforderungszyklus hinweg zu halten. Diese Methode hat einige Fehlermodi - sie klicken auf eine andere Aktion auf der Seite und verwenden dann beispielsweise ihre Zurück-Schaltfläche - ist aber auch relativ einfach. Sie möchten den ViewBag nicht verwenden. Der ViewBag soll Zusatzdaten als unidirektionale Übertragung an die Ansicht übergeben. Wie Sie festgestellt haben, behält es seinen Wert über einen Anforderungszyklus nicht bei.

FWIW, ich denke, Sie sollten die Frage id in beiden Methoden verwenden, nicht die Frage selbst als Teil der Abfragezeichenfolge übergeben.