2016-12-08 1 views
0

J'ai une vue principale qui contient un tableau reçu de l'action correspondante et il contient également une référence de vue partielle ci-dessousComment passer un tableau de la vue principale vue partielle en asp.net mvc 5

Créer .cshtml:

@model HrAndPayrollSystem.Models.EmployeeMasterA 

@using (Html.BeginForm()) 
{ 
    ViewData["fs_lbls"] = ViewBag.FS_lbls as string[]; 
    @Html.Partial("~/Views/EmployeeMasterA/FinalSettlementTAB.cshtml", Model) 
} 

et la vue partielle mentionnée ci-dessus est défini ci-dessous

FinalSettlementTAB.cshtml:

@model HrAndPayrollSystem.Models.EmployeeMasterA 

    @Html.DropDownList("DeptId", null, "Department") 

/* Print "ViewData["fs_lbls"]" array defined in the Main View `Create.cshtml` here */ 

J'ai un tableau défini dans le Create.cshtml, maintenant, je veux passer dans la vue partielle HR_EmployeeFinalSettlementTAB.cshtml et l'imprimer, Quelle est la bonne façon de cela?

Ce que j'ai essayé:

j'ai changé la ligne en @Html.Partial() ci-dessous:

@Html.Partial("~/Views/EmployeeMasterA/FinalSettlementTAB.cshtml", null, new ViewDataDictionary { { "fs_lbls", ViewData["fs_lbls"] } }) 

et modifié le fichier FinalSettlementTAB.cshtml comme ci-dessous:

@model HrAndPayrollSystem.Models.EmployeeMasterA 

@Html.DropDownList("DeptId", null, "Department") 

@foreach (var i in ViewData["fs_lbls"] as string[]) 
{ 
    @i 
} 

Mais il jette un exception InvalidOperationException à la ligne @Html.DropDownList("DeptId", null, "Department") en disant:

Il n'existe aucun élément ViewData de type 'IEnumerable' avec la clé 'DeptId'.

Il jette l'exception ci-dessus chaque fois que je tente de transmettre les données du tableau à la vue partielle en utilisant ViewDataDictionary, sinon, il fonctionne très bien, quand je ne suis pas. Comment puis-je me débarrasser de l'exception ci-dessus et passer correctement les données du tableau de la vue principale à la vue partielle?

Répondre

1

Je suggère que vous ajoutiez une nouvelle propriété à EmployeeMasterA pour stocker les étiquettes, de sorte que vous n'avez pas besoin d'utiliser ViewData du tout.

public class EmployeeMasterA 
{ 
    public string[] fs_lbls { get; set; } 

    public string SelectedLabel { get; set; } 

    public List<SelectListItem> Labels 
    { 
     get 
     { 

      if (this.fs_lbls == null) 
      { 
       return Enumerable.Empty<SelectListItem>().ToList(); 
      } 

      return (from label in fs_lbls 
        select new SelectListItem 
      { 
       Text = label, 
       Value = label 
      }).ToList(); 
     } 
    } 
} 

Create.cshtml

@model WebApplication1.Controllers.EmployeeMasterA 

@using (Html.BeginForm()) 
{ 
    @Html.Partial("FinalSettlementTAB", Model) 
    <input type="submit" value="Save"/> 
} 

FinalSettlementTAB.cshtml

@model WebApplication1.Controllers.EmployeeMasterA 

@Html.DropDownList("SelectedLabel", Model.Labels) 

contrôleur

public ActionResult Create() 
{ 
    var viewModel = new EmployeeMasterA(); 
    viewModel.fs_lbls = new[] {"Label1", "label 2"}; 

    return View(viewModel); 
} 

[HttpPost] 
public ActionResult Create(EmployeeMasterA viewModel) 
{ 
    return View(); 
} 

Vous pouvez définir le contenu de fs_lbls dans la méthode d'action du contrôleur, avant de renvoyer la vue Create. Lorsque vous publiez le formulaire, la propriété SelectedLabel contiendra l'élément sélectionné dans la liste déroulante. Évidemment, vous devrez changer les noms de propriété pour répondre à vos besoins, mais j'espère que cela vous donnera une idée.