2014-01-31 4 views
1

Настоящая (экономическая) проблема:Как динамически создавать формы?

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

Категория может быть «шоколадные батончики» или «липкие медведи». Каждую неделю (иногда каждый день) категории можно добавлять или удалять.

Прогнозисты просматривают каждую категорию и дают оценку.

My View Модель выглядит следующим образом:

public class estimate 
    {   
     public int Id { get; set; } 
     public string forecasterName { get; set; } 
     public int forecasterPrediction { get; set; } 
     public int salesDeptPrediction { get; set; } 
     public int financeDeptPrediction { get; set; } 
    } 

Моя база данных, которая находится в Entity Framework, точно такой же.

Допустим, база данных содержит следующие строки:

1 | Боб Форкастер | [null] | 4500 | 4000

2 | Hank Forecaster | [null] | 4500 | 4000

3 | Ike Forecaster | [null] | 4500 | 4000

Как я могу динамически создать форму, которая считывает количество экземпляров в этой базе данных, и выписывает форму со всей информацией, приведенной выше в таблице, с каждой «[null]», являющейся элементом @ Html.EditorFor ?

ответ

1

Чтобы было совершенно ясно, вы не «динамически создаете форму». Вы создаете форму, которая будет заполняться динамически на основе данных, которые она предоставила.

Для начала, вы будете нуждаться, чтобы создать EditorTemplate, который совпадает с именем вашего класса ViewModel в каталоге EditorTemplate:

/Views/Shared/EditorTemplates/estimate.cshtml 

форма внутри этой EditorTemplate будет выглядеть примерно так:

@using(Html.BeginForm("MyAction", "MyController")) 
{ 
    @Html.DisplayFor(m => m.Id) 
    @Html.DisplayFor(m => m.forecasterName) 
    @Html.TextBoxFor(m => m.forecasterPrediction) 
    @Html.DisplayFor(m => m.salesDeptPrediction) 
    @Html.DisplayFor(m => m.financeDeptPrediction) 
    <button type="submit">Submit</button> 
} 

Это как голые кости, как это получится. Каждый вызов Html.DisplayFor() будет просто отображать значение, содержащееся в Модели, переданной в EditorTemplate, а вызов Html.TextBoxFor() сгенерирует TextBox, который при отправке в форме автоматически привяжет свойство ViewModel, которое было использовано для его создания.

Теперь, чтобы на самом деле использовать этот EditorTemplate, вам нужно будет вызвать его из представления, содержащего либо соответствующий ViewModel сам, либо другой класс, который имеет соответствующий ViewModel в качестве свойства.

Я продемонстрирую, используя как один экземпляр класса estimate и коллекцию estimate с:

@model estimate 

@Html.EditorFor(m => Model) 

Это View не будет делать ничего, кроме отображения EditorTemplate для estimate класса.

Ниже будет отображать форму для каждого estimate, которую вы отправляете на Вид:

@model IEnumerable<estimate> 

@foreach(var estimate in Model) 
{ 
    @Html.EditorFor(m => estimate) 
} 

Имейте в виду, для приведенного выше примера, что как только вы отправите форму, страница будет делать полный постбэк, т.е. что он обновится, прежде чем вы сможете отправить больше данных. Есть несколько альтернатив этому, например, использование AJAX, но я оставил его простым для ответа.

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

+0

На моей [HTTPPost] я постоянно получаю NULL как часть массива. Какую-либо подсказку о том, почему? Я в основном конвертирую свои результаты из EntityFramework в ViewModel, создавая список из него, а затем отправляю его в свой вид - который отображается правильно, но когда я отправляю, входящие значения не принимаются либо как List/Enumerable , И Т.Д. Я создал папку «EditorTemplates» с классом «оценка». Итак, есть кнопка отправки рядом с экземпляром. – user2089039

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