Сохранять значение в переменной до публикации действия в MVC3 - PullRequest
0 голосов
/ 25 марта 2012

Привет, я разрабатываю приложение в MVC, используя nhibibernate.Это форум вопросов и ответов, где на первой странице список вопросов отображается в виде ссылки. Теперь, когда я нажимаю на ссылку, она переходит на страницу ответов, где отображаются ответы на конкретный вопрос.У меня есть две таблицы со следующими полями

Таблица вопросов:

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

Таблица ответов:

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

Вот что я пробовал: Inside 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"/>

}

Внутри контроллера:

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

Но проблема в том, что OnPost я получаю нулевое значение внутри переменной Question и, следовательно, я не могу отобразитьвопрос о посте, когда пользователь отправляет форму.Пожалуйста, помогите мне. Я знаю, что скучаю по глупости ..

Ответы [ 2 ]

0 голосов
/ 25 марта 2012

Есть несколько способов справиться с этим.Лучший способ, IMO, - закодировать идентификатор вопроса в URL и снова получить вопрос из своего хранилища.Внедрите кеширование в своем хранилище или в виде слоя, который оборачивает ваше хранилище, если требуется более высокая производительность.Другой способ - использовать TempData (по сути, Session) для хранения данных в течение одного цикла запроса.У этого метода есть несколько режимов сбоя - они нажимают другое действие на странице, а затем, например, используют кнопку «назад», - но также относительно просты.Вы не хотите использовать ViewBag.ViewBag предназначен для передачи вспомогательных данных в представление в виде односторонней передачи.Как вы обнаружили, он не сохраняет свое значение в течение цикла запроса.

FWIW, я думаю, вам следует использовать вопрос id в обоих методах, а не передавать сам вопросвокруг как часть строки запроса.

0 голосов
/ 25 марта 2012

попробуйте изменить на

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

Теперь вы можете получить его в переменной Question.

Лично я не думаю, что это хорошая идея, чтобы передать вопрос, как он есть в строке запроса. Я считаю, что строка запроса имеет ограничение на количество символов. в идеале вы должны передать только идентификатор вопроса и снова построить объект вопроса в методе действий, запросив постоянный источник данных.

Какова максимально возможная длина строки запроса?

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

...