2014-11-26 3 views
2

Я разрабатываю приложение ASP.NET MVC, заполняя dropdownlist для просмотра работы в методе get. Я заселение, чтобы посмотреть, как это в моем контроллереОпубликовать IEnumerable коллекции из представления в mvc

[HttpGet] 
public ActionResult CreateEmployeeFamilyDetails(EmployeeSuperClass employeeSuperClass, int i = 0) 
{ 
    employeeSuperClass.FamilyDetailsFields = new FamilyList(); 
    employeeSuperClass.FamilyDetailsFields.familyMembersList.Insert(0, new EmployeeFamilyTable()); 
    *employeeSuperClass.FamilyDetailsFields.employee_RelationTable = dt.GetRelations();* 
    *employeeSuperClass.FamilyDetailsFields.employee_BloodGroupTable = dt.GetBloodGroups();* 
    *employeeSuperClass.FamilyDetailsFields.employee_NationalityTable = dt.GetNationalities();* 

    return View("CreateEmployeeFamilyDetails", employeeSuperClass); 
} 

Пожалуйста, смотрите в помеченных линии

В случае, если есть какая-либо ошибка в модели я получает пустую ссылку

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

[HttpPost] 
public ActionResult CreateEmployeeFamilyDetails(EmployeeSuperClass employeeSuperClass, string Command) 
{ 
    if (ModelState.IsValid) 
    { 
    return("some view"); 
    } 
    else 
    { 
    return view(employeeSuperClass); 
    } 
} 

Я знаю, что мы снова должны создать экземпляр для заполнения DropDownList это мусор, чтобы сделать то же самое снова и снова

Может ли кто-нибудь объяснить, как сохранить выпадающий список коллекции в отдельности и опубликовать их также с помощью модели? (примечание: employee_relationTable является IEnumerable сбор и это relationtable типа эта таблица содержит Relation идентификаторов и relationname полей и я использую эту таблицу в этом классе, как показано ниже

public IEnumerable<EmployeeRelationTable> employee_RelationTable { get; set; } 

Для отдыха также я использую тот же подход

Можем ли мы размещать employee_RelationTable из поля зрения и как?

Пожалуйста, помогите и ваша помощь будет высоко оценена

+4

Вы не должны. Отправка всех этих данных клиенту, а затем обратно через провод будет просто замедлить ваше приложение. Создайте закрытую функцию, которая заполняет данные и вызывает их как из методов GET, так и POST, и если вы беспокоитесь о вызовах базы данных, подумайте о сохранении коллекций в сеансе. –

ответ

2

Предполагая dt - это поле участника, доступное ко всем методам, что вы можете сделать, - это СУБДИТЬ популяцию DropDowns в Модели просмотра в отдельном методе, например.

private void PopulateDropDownsOnViewModel(EmployeeSuperClass model) 
{ 
    model.FamilyDetailsFields = new FamilyList 
    { 
     employee_RelationTable = dt.GetRelations(), 
     employee_BloodGroupTable = dt.GetBloodGroups(), 
     employee_NationalityTable = dt.GetNationalities() 
    } 
} 

который может быть использован в Get:

[HttpGet] 
public ActionResult CreateEmployeeFamilyDetails(EmployeeSuperClass employeeSuperClass, int i = 0) 
{ 
    PopulateDropDownsOnViewModel(employeeSuperClass); 
    return View("CreateEmployeeFamilyDetails", employeeSuperClass); 
} 

и в Post (и любых других действиях контроллера, которые нуждаются в раскрывающемся меню)

[HttpPost] 
public ActionResult CreateEmployeeFamilyDetails(EmployeeSuperClass employeeSuperClass, string Command) 
{ 
    if (ModelState.IsValid) 
    { 
     return("some view"); 
    } 
    else 
    { 
      PopulateDropDownsOnViewModel(employeeSuperClass); 
      return View(employeeSuperClass); 
    } 
} 

Если падение капли является static, вы также можете посмотреть на кэширование этих данных, чтобы предотвратить впустую IO в базу данных.

Но нет, не сериализуйте данные в представлении каким-либо образом (помните WebForms ViewState?) Или извлекайте данные из представления напрямую - это нарушает парадигму MVC - контроллер отвечает за предоставление данных для визуализации.

+0

Спасибо, что его рабочий штраф – user3168867

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