2010-07-11 5 views
1

Modifier une fois de plus:Envoyer deux modèles en un Voir .Net dans VB

il semble donc comme je l'ai compris la partie d'adresse aussi, dans la classe que j'ai:

Public ReadOnly Property addresses As IEnumerable(Of Address) 
     Get 
      Return _these_addresses 
     End Get 
    End Property 

Et le modèle que j'ai:

<% For Each item In Model.addresses%> 

     <tr> 
      <td> 
       <a href='<%: Url.Action("Edit", "Address", New With { .pid=Model.ContactID, .id=item.AddressID }) %>'> 
        <img src='<%: Url.Content("~/Content/Images/Edit.jpg") %>' alt="Edit" /> 
       </a> 
       <a href='<%: Url.Action("Details", "Address", New With { .pid=Model.ContactID, .id=item.AddressID }) %>'> 
        <img src='<%: Url.Content("~/Content/Images/Detail.jpg") %>' alt="Details" /> 
       </a> 
       <a href='<%: Url.Action("Delete", "Address", New With { .pid=Model.ContactID, .id=item.AddressID }) %>'> 
        <img src='<%: Url.Content("~/Content/Images/Delete.jpg") %>' alt="Delete" /> 
       </a> 
      </td> 
      <td> 
       <%: item.Street%> 
      </td> 
      <td> 
       <%: item.City%> 
      </td> 
      <td> 
       <%: item.StateID%> 
      </td> 
      <td> 
       <%: item.CountryID%> 
      </td> 
      <td> 
       <%: item.Zip%> 
      </td> 
     </tr> 
    <% Next%> 

    </table> 

Modifier Encore une fois:

J'ai ajouté ce pour tous les domaines en contact avec la classe et il travaille ... Je juste besoin de trouver la liste des adresses maintenant ...

Public ReadOnly Property FirstName() As String 
     Get 
      Return _this_contact.FirstName 
     End Get 
    End Property 

EDIT:

J'ai à ce sujet a compris:

Je pris un coup de feu dans l'obscurité et a fait une ContactViewModel à base de Exemples de C J'ai trouvé dans la recherche sur la façon de le faire

Imports System 
Imports System.Collections.Generic 
Imports System.Linq 
Imports System.Web 
Imports TotallyAwesomeCRM.Contact 
Imports TotallyAwesomeCRM.Address 

Public Class ContactViewModel 
    Public contact As Contact 
    Public address As Address 
    Private _this_contact As Contact 
    Private _these_addresses As System.Linq.IQueryable(Of Address) 

    Sub New(ByVal this_contact As Contact, ByVal these_addresses As System.Linq.IQueryable(Of Address)) 
     ' TODO: Complete member initialization -this was added by the framework for me when I tried to call this class - I don't know what to do here - resources? 
     _this_contact = this_contact 
     _these_addresses = these_addresses 
    End Sub 

End Class 

donc, dans mon contrôleur I:

Function Details(ByVal id As Integer) As ActionResult 
     Dim this_contact = GetContact(id) 
     Dim these_addresses = 
      From address In addressDataContext.Addresses, xref In addressDataContext.ContactAddressesXrefs 
      Where address.AddressID = xref.AddressID And xref.ContactID = id 
      Select address 

     Dim viewModel = New ContactViewModel(this_contact, these_addresses) 
     Return View(viewModel) 
    End Function 

Et dans le modèle, il a trouvé le contact quand j'ai commencé à taper Model.contact

<%: Model.contact.FirstName%>

Mais il m'a donné là une erreur: NullReferenceException: Référence d'objet non mettre à une instance d'un objet.

Il ne doit pas être nulle ... S'il vous plaît me aider à la TODO

========================== ============================================= ===== ORIGINALPOST:

Ceci est ma première aventure .NET. Tout ce que j'ai fait jusqu'ici j'ai compris. OK J'ai des contacts, et les contacts peuvent avoir plusieurs adresses. Je voudrais afficher ces adresses quand je regarde le détail d'un contact Je voudrais également avoir un conteneur qui est une vue de liste de ses adresses. À partir de cette liste, je souhaite pouvoir modifier/supprimer/afficher l'adresse.

Ma structure de base de données est:

Tables:

Contacts 
<contains contact info and PK> 

Addresses 
<contains address info and PK> 

ContactAddressesXref 
ContactID 
AddressID 

J'ai essentiellement été l'édition du squelette des fichiers de l'application vide ASP.NET MVC me donne

Voici donc la dernière chose que je J'ai essayé dans mon contrôleur de contact:

' 
    ' GET: /Contacts/Details/5 

    Function Details(ByVal id As Integer) As ActionResult 
     Dim this_contact = 
         From contact In dataContext.Contacts, address In addressDataContext.Addresses, xref In addressDataContext.ContactAddressesXrefs 
         Where address.AddressID = xref.AddressID And xref.ContactID = id 
         Select contact, address 
     Return (View(this_contact)) 
    End Function 

Ce que je reall Je voulais faire était interroger les adresses séparément et les envoyer en tant que leur propre ensemble. Je ne sais pas si faire ceci est la bonne chose à faire, mais quand j'ai essayé d'envoyer deux modèles, ça a flippé.

qui échoue bien sûr parce que la vue a cela il:

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of IEnumerable (Of TotallyAwesomeCRM.Contact))" %> 

J'ai essayé:

Inherits="System.Web.Mvc.ViewPage(Of IEnumerable (Of TotallyAwesomeCRM.Contact, Of TotallyAwesomeCRM.Address)) 

Il a dit:

'InitializeCulture' is not a member of 'ASP.views_contacts_details_aspx'. 

Alors OK, j'ai essayé:

Inherits="System.Web.Mvc.ViewPage" 

Et il jette et erreur ici:

<div class="display-field"><%: Model.FirstName%></div> 

Bien sûr, si je me trompe dans le contrôleur? Je sais que je ne peux pas avoir juste System.Web.Mvc.ViewPage (Of IEnumerable (Of TotallyAwesomeCRM.Contact)) qu'il devra accepter plus que cela. J'ai essayé le jacking avec la partie Model.FirstName en disant Contact.FirstName, mais cela ne s'est pas produit dans la liste déroulante quand j'ai commencé à écrire Contact. Je pourrais le faire facilement dans d'autres langues, .Net semble être un jeu de balle différent. S'il vous plaît aider!

+0

S'il vous plaît garder des tags comme "VB Visual Basic 2010 LINQ to SQL" sur le titre. Laissez-les simplement dans les tags. –

+0

OK Je voulais dire Visual Studio, je n'essayais pas de faire est recherche, je pensais que ces choses étaient importantes à savoir pour être en mesure de répondre à la question, encore une fois, je suis tout nouveau à .net, donc peut-être pas . – KacieHouser

+0

Laissez-les dans les tags et ils sont très consultables. Mais cela rend le titre lisible. –

Répondre

1

Vous n'avez pas besoin de "todo: terminer l'initialisation du membre ..." (en plus de l'enlever :-)). Vous devez changer la propriété pour le contact et l'adresse.

Essayez ceci:

Public Class ContactViewModel 

    Private _this_contact As Contact 
    Private _these_addresses As System.Linq.IQueryable(Of Address) 

    Sub New(ByVal this_contact As Contact, ByVal these_addresses As System.Linq.IQueryable(Of Address)) 
     ' TODO: Complete member initialization -this was added by the framework for me when I tried to call this class - I don't know what to do here - resources? 
     _this_contact = this_contact 
     _these_addresses = these_addresses 
    End Sub 

    Public ReadOnly Property Contact As Contact 
     Get 
      Return _this_contact 
     End Get 
    End Property 

    Public ReadOnly Property Addresses As System.Linq.IQueryable(Of Address) 
     Get 
      Return _these_addresses 
     End Get 
    End Property 

End Class 
+0

Donc je n'ai pas besoin de créer une propriété pour chaque champ de contact? J'ai les adresses fonctionnant de cette façon, mais j'ai créé une propriété pour chaque champ en contact, cela fonctionne, mais c'est beaucoup de codage supplémentaire si je n'ai pas à le faire. – KacieHouser

+0

Correct. Vous avez juste besoin d'une propriété dans votre viewmodel pour les contacts et les adresses. Ensuite, à votre avis, vous adressez le jet de propriété requis que. par exemple model.Contact.FirstName, model.Addresses (0) .Country. –

Questions connexes