2013-12-09 3 views
0

Прежде всего, позвольте мне сказать, что я новичок в MVC, поэтому, если что-то кажется странным, вот почему. Я, вероятно, не имею подходящего aproach, поэтому мне хотелось бы получить некоторые рекомендации.Публикация неизвестного количества полей

У меня есть форма, из которой пользователь должен ввести переводы на страницу. Переводы обрабатываются как список объектов TranslationObjects для объекта страницы. Мне нужен способ отображения полей ввода в форме для каждой ветви языка, представленной на сайте, и позволить пользователю заполнить их и отправить их обратно на контроллер. Этот пример - просто упрощение более сложной модели, но это довольно хорошо объясняет проблему.

модель представление:

public class Page 
{ 
    public List<TranslationObject> Translation { get; set; } 
} 

public class TranslationObject 
{ 
    public string LanguageBranch { get; set; } 
    public string PageName { get; set; } 
    public string PageDescription { get; set; } 
} 

контроллера для визуализации формы:

public ActionResult AddPage() 
    { 
     var model = new Page {Translation = new List<TranslationObject>()}; 

     foreach (var languageBranch in new[] {"en", "sv", "de"}) // These are normally loaded from database 
     { 
      model.Translation.Add(new TranslationObject{ LanguageBranch = languageBranch}); 
     } 

     return View(model); 
    } 

Вид:

@model MvcApplication1.Models.Page 
    @using (Html.BeginForm("SubmitPage", "Home", FormMethod.Post)) 
    { 
     foreach (var translation in Model.Translation) 
     { 
      @Html.LabelFor(x => x.Translation.FirstOrDefault(y => y.LanguageBranch == translation.LanguageBranch).PageName) 
      @Html.TextBoxFor(x => x.Translation.FirstOrDefault(y => y.LanguageBranch == translation.LanguageBranch).PageName)<br/> 
      @Html.LabelFor(x => x.Translation.FirstOrDefault(y => y.LanguageBranch == translation.LanguageBranch).PageDescription) 
      @Html.TextBoxFor(x => x.Translation.FirstOrDefault(y => y.LanguageBranch == translation.LanguageBranch).PageDescription) 
     } 
     <input type="submit" value="Submit"/> 
    } 

И контроллер для поста:

[HttpPost] 
    public ActionResult SubmitPage(Page model) 
    { 
     // Save model to db 
     return View(); 
    } 

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

+2

пользователя Для вместо ForEach.In этого случай у вас будет список населенного на posting.Also убедиться в списке переводы инициализируются в конструкторе модели. – Priyank

ответ

0

Используйте вместо foreach.

@model MvcApplication1.Models.Page 
    @using (Html.BeginForm("SubmitPage", "Home", FormMethod.Post)) 
    { 
     for(int i=0;i<Model.Translation.Count;i++) 
     { 
      @Html.LabelFor(x => x.Translation[i].PageName) 
      @Html.TextBoxFor(x => x.Translation[i].PageName)<br/> 
      @Html.LabelFor(x => x.Translation[i].PageDescription) 
      @Html.TextBoxFor(x => x.Translation[i].PageDescription) 
     } 
     <input type="submit" value="Submit"/> 
    } 

И Page Конструктора инициализация перевода

+0

Спасибо! Это сделало это :) –

+0

Как мне вернуть свойство languagebranch объекта TranslationObject обратно на контроллер? Должен ли я хранить его в скрытом поле? –

+0

Да, используя @ Html.HiddenFor (x => x.Translation [i] .LanguageBranch) – Priyank

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