2010-07-07 2 views
1

У меня есть модель компании и модель Employee, и я хочу создать компанию, а затем создать несколько сотрудников для компании в одном представлении.Как создать несколько записей в одном представлении в C# ASP.NET MVC?

Как это сделать в представлении?

И что мне делать в методе Create POST для поддержки этого многопозиционного представления?

+1

Вам нужно будет уточнить, это не имеет смысла. –

+0

Хорошо, я переформулировал вопрос. – Fred

ответ

1

Я действительно понятия не имею, что вы говорите, но вот дикий догадка: Одна запись Foo, несколько enries, IEnumerable<Foo>. Звучит знакомо?

0

Если я правильно понял вопрос, я думаю, что эта статья актуальна: http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

Мое предложение заключается в попытке воспользоваться модели поведения переплетного по умолчанию с помощью именования полей соответствующим образом. Обратитесь к статье за ​​конкретными соглашениями об именах для различных ситуаций.

EDIT: добавлена ​​приведенная ниже логика примера. Обратите внимание, что вызов Html.Hidden и Html.Input с третьим параметром как анонимным типом с указанным свойством id действительно не требуется; это мое предпочтение для обеспечения того, что эти функции не создают HTML-элементы с недопустимыми атрибутами id (содержащие квадратные скобки).

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
     <title>Example</title> 
</head> 
<body> 
     <div><% 
// Get your list of data objects from the model somehow. This will be specific to your model 
IEnumerable<MyData> items = Model as IEnumerable<MyData>; 

// if there are items 
if (items != null) 
{ 
    // then iterate over them to create fields inside of a form 
    using (Html.BeginForm()) 
    { 
     int itemIndex = 0; 
     foreach (var item in items) 
     { %> 
      <div> 
       <%= Html.Hidden("MyData[" + itemIndex + "].MyDataID", item.MyDataID, new { id = "MyData_" + itemIndex + "_MyDataID" })%> 
       <%= Html.TextBox("MyData[" + itemIndex + "].FirstName", item.FirstName, new { id = "MyData_" + itemIndex + "_FirstName" })%> 
       <%= Html.TextBox("MyData[" + itemIndex + "].LastName", item.LastName, new { id = "MyData_" + itemIndex + "_LastName" })%> 
      </div><% 
          itemIndex++; 
     } 
    } 
} %> 
     </div> 
</body> 
</html> 

Вы можете иметь метод действия в контроллере для обработки размещены данные:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Example(IList<MyData> MyData) 
    { 
     // the MyData parameter will automatically be populated by the default ModelBinder using the values stored in the form collection (the posted data). 
    } 
+0

Кажется, это правильное направление. Но мне интересно, как я могу генерировать поля «на лету» в представлении. – Fred

+0

Используйте jQuery + ajax для обновления div, содержащего вашу форму. –

0

Если модель по умолчанию связующий (объект, который преобразует значения формы к объекту вы используете как параметр в методе действия) недостаточно для ваших целей, вы можете подумать об использовании custom model binder

0

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

Что я делаю, когда мне нужно несколько объектов в представлении, я создаю класс «ViewModel». Обычно я создаю материал модели домена в отдельном проекте, а затем я использую папку моделей в проекте MVC для размещения своих ViewModels.

Так создать класс, как этот

public class SampleViewModel 
{ 

    public SampleViewModel() { } 

    public Company Company { get; set; } 

    public IEnumerable<Employee> Employees { get; set; } 

} 

Теперь связать свой вид модели представления образца.

public ViewResult SampleAction(SampleViewModel svm) 
{ 
    if (svm == null) 
      svm = new SampleViewModel() { Company=/*getcompany*/, Employees=/*get ienumerable employees */ }; 
} 

Этот метод хорошо послужил моим целям. Надеюсь, это то, что вы искали.

EDIT: Я прочитал один из ваших комментариев. У Фреда и меня не должно быть достаточного количества ответов, чтобы ответить на другие ответы или что-то (извините, я новичок). Чтобы сгенерировать эти поля «на лету» в представлении, вы, очевидно, привязали бы интерфейс пользователя к полю компании (Model.Company), затем перечислите через IEnumerable (Model.Employees) и создаете любой пользовательский интерфейс для каждого из них. Я относительно новичок в ASP.NET MVC, поэтому я не уверен, как это влияет на привязку модели к POST, но в самом аренде я уверен, что вы могли бы перебирать значения post в своем методе действий и создавать список IEnumerable для привяжите обратно к ViewModel.

Если количество полей в представлении динамическое и вы получаете количество сотрудников X, тогда вам придется перебирать через коллекцию сообщений, чтобы привязать их к вашей модели ViewModel. Оттуда вы можете сделать все, что вам нужно, с компанией и сотрудниками, подключив их к вашей модели домена и т. Д.

Если вы загружаете форму в первый раз, вы, вероятно, не будете иметь никаких сотрудников в так что пользовательский интерфейс не загрузится. Вам нужно будет проверить размер списка, если в нуле вы создадите один набор компонентов пользовательского интерфейса, привязанных к Employee. Тогда у вас, вероятно, была бы кнопка javascript для добавления другого сотрудника, который дублирует этот набор пользовательских интерфейсов столько раз, сколько им нужно.

+0

Очевидно, что у вас, вероятно, будет более одного метода действий, для GET и POST, но вы получите эту идею. – Chev