2014-02-20 3 views
0

Я пытаюсь создать список выбора в моей форме. Я использую Razors Html.DropDownListFor, но я не уверен, как правильно заполнить мой DropDownList соответствующими значениями из моей модели.Проблема создания DropdownListFor с Razor

for (int i = 0; i < Model.Questions.Count(); i++) 
{ 
    for (int j = 0; j < Model.Questions[i].Options.Count(); j++) 
    { 
     @Html.DropDownListFor(m=>m.Questions[i].Options[j].IsSelected, ????) 
    } 
} 

МОДЕЛИ:

public class QuestionViewModel 
{ 
    public int? Id { get; set; } 

    public string QuestionType { get; set; } 

    public string SubType { get; set; } 

    public string Text { get; set; } 

    public int SortOrder { get; set; } 

    public bool IsHidden { get; set; } 

    public List<QuestionOptionViewModel> Options { get; set; }  
} 

public class QuestionOptionViewModel 
{ 
    public int? Id { get; set; } 

    public string Text { get; set; } 

    public string Value { get; set; } 

    public bool IsChecked { get; set; } 

    public int Selected { get; set; } 
} 

ответ

1

Проверить ниже решение. Я немного изменил свои модели -

public class QuestionMainModel 
{ 
    public List<QuestionViewModel> Questions { get; set; } 
} 

public class QuestionViewModel 
{ 
    public int? Id { get; set; } 
    public string Text { get; set; } 
    public List<QuestionOptionViewModel> Options { get; set; } 
    public int Selected { get; set; } 
} 
public class QuestionOptionViewModel 
{ 
    public int? Id { get; set; } 
    public string Text { get; set; } 
    public string Value { get; set; }   
} 

Действие контроллер, который заполнит вид -

public ActionResult Index() 
    { 
     QuestionMainModel model = new QuestionMainModel(); 

     List<QuestionOptionViewModel> options = new List<QuestionOptionViewModel>(); 
     options.Add(new QuestionOptionViewModel(){ Id = 1, Text = "Ans1", Value = "1"}); 
     options.Add(new QuestionOptionViewModel(){ Id = 2, Text = "Ans2", Value = "2"}); 
     options.Add(new QuestionOptionViewModel(){ Id = 3, Text = "Ans3", Value = "3"}); 

     model.Questions = new List<QuestionViewModel>(); 
     model.Questions.Add(new QuestionViewModel() { Id = 1, Text = "Question1", Options = options }); 

     return View(model); 
    } 

Вид, который отображается следующим образом -

@model MVC.Controllers.QuestionMainModel 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

@using (Html.BeginForm("Submit", "sample", FormMethod.Post)) 
{ 

    for (int i = 0; i < Model.Questions.Count; i++) 
    { 
     @Html.HiddenFor(m => m.Questions[i].Id) 
     @Html.LabelFor(m => m.Questions[i].Text, Model.Questions[i].Text) 
     @Html.DropDownListFor(m => m.Questions[i].Selected, new SelectList(Model.Questions[i].Options, "Value", "Text"), "Select an option") 
    } 

    <input type="submit" value="Click" /> 
} 

И когда вы щелкаете представить , он будет действовать ниже действия контроллера -

public ActionResult Submit(QuestionMainModel model) 
    { 
     return null; 
    } 

И выбранный ответ будет выглядеть следующим образом -

enter image description here

ПРИМЕЧАНИЕ: Если вы хотите разместить все варианты и текст вопроса, а затем использовать HiddenFields, так же, как я сделал для Is.

+0

Мне не нужно было вносить какие-либо значительные изменения в мою модель. Я действительно взял то, что у вас было для DropDownListFor, и в значительной степени это работает. @ Html.DropDownListFor (m => m.Questions [i] .Выбранный, новый SelectList (Model.Questions [i] .Options, «Id», «Text»), новый {@class = «form-control»}) – allencoded

+0

Будет ли то же самое работать для радио? – allencoded

+0

@allencoded, надеюсь, да, попробуйте. Но вам может понадобиться немного изменить код Razor. – ramiramilu

0

Вы можете попробовать следующее:

for (int i = 0; i < Model.Questions.Count(); i++) 
{ 
    @Html.DropDownListFor(m => 
     m.Questions[i].Id, 
     new SelectList(
      m.Questions[i].Options, 
      "Text", 
      "Value", 
      m.Questions[i].Options.SingleOrDefault(x = > x.IsChecked).Value)) 
} 

Но имейте в виду, что вы должны иметь только один вариант, который IsChecked флаг установлен верно. В противном случае вы получите сообщение об ошибке.

+0

Выполнение этой функции возвращает ошибку. В экземпляре объекта не задана ссылка на объект – allencoded

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