2016-07-22 1 views
0

J'essaie de transmettre un paramètre au Create @ Html.ActionLink dans la vue Index, mais j'ai quelques difficultés.Passer un paramètre à Html.ActionLink

J'ai un contrôleur d'adresse dans lequel l'utilisateur voit les adresses d'une personne spécifique quand ils accèdent à la vue d'index. Je voudrais passer ce PersonID à la vue Créer afin qu'ils ne doivent pas sélectionner ou entrer la personne lorsqu'ils créent une nouvelle adresse. Mon actionlink ressemble à ceci -

@Html.ActionLink("Create New", "Create", new { id = Model.[PersonID is not a choice]}) 

Mon problème est qu'après Model PersonID n'est pas une option. Je ne suis pas sûr comment obtenir PersonID à la fonction Créer dans le AddressController.

J'ai essayé de suivre avec le poste - Passing a parameter to Html.ActionLink when the model is IEnumerable<T> - où ils ont le même problème. Les premières réponses semblent être une solution probable, mais je ne pouvais pas reproduire le modèle qu'elles avaient créé et quand j'ai mis les pièces dans mon modèle d'adresse je ne pouvais pas dupliquer le code qu'elles avaient exécuté dans le contrôleur. Y a-t-il une autre solution?

Mon Adresse modèle -

public partial class Address 
{ 
    public int AddressID { get; set; } 
    public int PersonID { get; set; } 
    [Display(Name="Address")] 
    public string Address1 { get; set; } 
    [Display(Name = "Address 2")] 
    public string Address2 { get; set; } 
    public string City { get; set; } 
    [Display(Name="State")] 
    public string StateAbbr { get; set; } 
    [Display(Name = "Zip Code")] 
    public string Zip { get; set; } 

    public virtual Person Person { get; set; } 

    public List<Address> Address { get; set; } 
} 

Mon AddressController Index

public ActionResult Index(int id) 
    { 
     var addresses = db.Addresses.Include(a => a.Person) 
      .Where(a => a.PersonID == id); 

     Person person = db.People.Find(id); 

     ViewBag.FullName = person.FirstName + " " + person.LastName; 

     person.PersonID = id; 

     return View(addresses.ToList()); 
    } 

Adresse de vue Index -

@model IEnumerable<OpenBurn.Models.Address> 

@{ 
    ViewBag.Title = "Address"; 
} 

<h2>Address</h2> 

<p> 
    @Html.ActionLink("Create New", "Create", new { id = .PerosnID }) 
</p> 

<h3 style="color: #008cba;"> @ViewBag.FullName </h3> 

<table class="table"> 
<tr> 
    <th> 
     @Html.DisplayNameFor(model => model.Address1) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.Address2) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.City) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.StateAbbr) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.Zip) 
    </th> 

    <th></th> 
</tr> 

@foreach (var item in Model) { 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.Address1) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Address2) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.City) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.StateAbbr) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Zip) 
    </td> 

    <td> 
     @Html.ActionLink("Edit", "Edit", new { id=item.AddressID }) | 
     @Html.ActionLink("Details", "Details", new { id=item.AddressID }) | 
     @Html.ActionLink("Delete", "Delete", new { id=item.AddressID }) 
    </td> 
</tr> 
} 

</table> 

Répondre

1

Depuis la syntaxe @Html.ActionLink n'est pas dans une boucle foreach, vous avez évidemment ne peut pas utiliser IEnumerable<OpenBurn.Models.Address> comme modèle. Vous avez besoin d'une nouvelle classe de modèle qui contient une propriété qui contient ces enregistrements d'adresse et une propriété qui contient la valeur PersonID. Vous devez également utiliser la même classe de modèle pour transmettre la valeur FullName au lieu d'utiliser ViewBag. Je suggère la classe modèle ci-dessous

public class AddressIndexModel 
{ 
    public AddressIndexModel() 
    { 
     this.Addresses = new List<Address>(); 
    } 

    public int PersonID { get; set; } 
    public string FullName { get; set; } 
    public List<Address> Addresses { get; set; } 
} 

puis changer votre contrôleur à ce

public ActionResult Index(int id) 
{ 
    var addresses = db.Addresses.Include(a => a.Person) 
     .Where(a => a.PersonID == id); 

    Person person = db.People.Find(id); 

    AddressIndexModel model = new AddressIndexModel(); 
    model.PersonID = id; 
    model.FullName = person.FirstName + " " + person.LastName; 
    model.Addresses = addresses.ToList(); 

    return View(model); 
} 

et changer votre point de vue ci-dessous pour

@model AddressIndexModel 

@{ 
    ViewBag.Title = "Address"; 
} 

<h2>Address</h2> 

<p> 
    @Html.ActionLink("Create New", "Create", new { id = Model.PersonID }) 
</p> 

<h3 style="color: #008cba;"> @Model.FullName </h3> 

<table class="table"> 
<tr> 
    <th> 
     Address 
    </th> 
    <th> 
     Address 2 
    </th> 
    <th> 
     City 
    </th> 
    <th> 
     State 
    </th> 
    <th> 
     Zip Code 
    </th> 

    <th></th> 
</tr> 

@foreach (var item in Model.Addresses) { 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.Address1) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Address2) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.City) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.StateAbbr) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Zip) 
    </td> 

    <td> 
     @Html.ActionLink("Edit", "Edit", new { id=item.AddressID }) | 
     @Html.ActionLink("Details", "Details", new { id=item.AddressID }) | 
     @Html.ActionLink("Delete", "Delete", new { id=item.AddressID }) 
    </td> 
</tr> 
} 

</table> 
+0

-vous Remercier. Tout a l'air bien mais je reçois un rouge squiggly sous ID dans le # Html.ActionLink pour créer. Il dit que le 'objet' ne contient pas de définition pour 'id' –

+0

Etes-vous sûr que votre syntaxe est la suivante: '@ Html.ActionLink (" Créer nouveau "," Créer ", nouveau {id = Model.PersonID}) 'et pas comme ça:' @ Html.ActionLink ("Créer un nouveau", "Créer", nouvel objet {id = Model.PersonID}) '? – ekad

+0

c'était tout. C'était utile et auto-complétant pour moi. J'ai rencontré une erreur quand j'ai essayé de l'exécuter cependant - Quand il essaye d'accéder à la vue d'index il expecte @foreach sur le Model.Addreses en disant {"Référence d'objet non définie à une instance d'un objet"} –