2013-09-28 4 views
2

У меня есть следующая модель, используемая для викторины. Я пытаюсь отправить форму и передать существующую модель обратно в Action, поскольку она уже была инициализирована в действии Index.Сохранение модели после отправки формы

public class QuizModel 
{ 
    private List<string> _Responses; 

    public List<string> Responses 
    { 
     get 
     { 
      if (_Responses == null) 
      { 
       _Responses = new List<string>() { "Response A", "Response B", "Response C", "Response D" }; 
      } 
      return _Responses; 
     } 
    } 

    public int? SelectedIndex { get; set; } 

    public string Question { get; set; } 
} 

Со следующим видом:

<div class="title">Question</div> 
<span id="question">@Model.Question</span> 
@if (!Model.UserHasAnswered) 
{ 
using (Html.BeginForm("Submit", "Quiz", FormMethod.Post)) 
{ 
    for (int i = 0; i < Model.Responses.Count; i++) 
    { 
     <div class="reponse">@Html.RadioButtonFor(m => m.SelectedIndex, i)@Model.Responses[i]</div> 
    } 
    <input type="submit" value="This is the value" />        
} 
} 
else 
{ 
    <div id="explanation">@Model.Explanation</div> 
} 

и контроллер ...

// 
    // GET: /Quiz/ 

    public ActionResult Index() 
    { 
     QuizModel model = new QuizModel() 
     { 
      Question = "This is the question", 
      Explanation = "This is the explanation", 
      UserHasAnswered = false 
     }; 

     return PartialView(model); 
    } 

    // 
    // POST: /Quiz/Submit 
    [HttpPost] 
    public ActionResult Submit(QuizModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      int? selected = model.SelectedIndex; 

      model.UserHasAnswered = true; 
     } 

     return View("Index", model); 
    } 

Когда модель приходит на Submit действия содержит только SelectedIndex и не вопрос или свойства Объяснения , Как я могу передать свое представление о том, чтобы передать оригинальную модель, полученную им обратно в действие «Отправить»?

ответ

3

Когда вы впервые показываете индекс, ваши вопросы и пояснения отображаются правильно. Затем вы отправляете форму, а вопрос и пояснение не попадают в действие контроллера.

Это потому, что ваш FORM не имеет полей ввода, содержащих вопрос и пояснение.

Добавьте это в форме:

@Html.HiddenFor(x => x.Question) 
@Html.HiddenFor(x => x.Explanation) 

Если Объяснение редактируемые пользователем, вместо добавления Скрытое для этого сделать:

@Html.TextAreaFor(x => x.Explanation) 

Помните: все данные, которые вы необходимо отправить на ваш контроллер, чтобы он находился в ВХОДАХ внутри вашей ФОРМЫ.

Таким образом, ваше мнение будет стали:

<div class="title">Question</div> 
<span id="question">@Model.Question</span> 
@if (!Model.UserHasAnswered) 
{ 
using (Html.BeginForm("Submit", "Quiz", FormMethod.Post)) 
{ 
    @Html.HiddenFor(x => x.Question) 
    @Html.HiddenFor(x => x.Explanation) 
    for (int i = 0; i < Model.Responses.Count; i++) 
    { 
     <div class="reponse">@Html.RadioButtonFor(m => m.SelectedIndex, i)@Model.Responses[i]</div> 
    } 
    <input type="submit" value="This is the value" />        
} 
} 
else 
{ 
    <div id="explanation">@Model.Explanation</div> 
} 
0

Я считаю, что ваше index действия должно быть, как показано ниже в вашем сценарии:

public ActionResult Index(QuizModel model) 
{ 
    if(model == null) 
    { 
     model = new QuizModel() 
     { 
      Question = "This is the question", 
      Explanation = "This is the explanation", 
      UserHasAnswered = false 
     }; 
    } 

    return PartialView(model); 
} 

Надеется, что это поможет !!

+0

Тем не менее не в состоянии получить доступ к той же самой модели из Submit действия. Когда форма отправляется в действие Submit, я бы хотел, чтобы она получила ту же модель, которая была инициализирована в действии Index. – jimmyjambles

+0

@jimmyjambles, проверьте свою модель в действии Submit. –

+0

Я, модель входит только с выбранным свойством selectedIndex, а свойства Question и Explanation равны нулю. – jimmyjambles

Смежные вопросы