2013-07-08 4 views
0

Je suis sûr qu'il y a eu beaucoup de gens qui ont posé ce genre de question mais je n'arrive pas à comprendre comment le dire.Page pour créer un objet et un sous-objet

Je vais essayer d'expliquer. Je travaille à modéliser un réseau Ethernet où les appareils ont des adresses IP. J'ai configuré mes modèles de structure d'entité afin que l'adresse IP et le sous-réseau soient stockés dans une table distincte pour garantir l'unicité du système. Je souhaite que l'utilisateur puisse créer un périphérique et son adresse IP associée en même temps si l'adresse IP qu'ils souhaitent ne figure pas déjà dans une liste déroulante.

Je SETIP une partie de la RenderPartial page d'adresse IP sur la page de l'appareil et je reçois cette erreur:

Voici la question, Comment puis-je corriger cette erreur:

The model item passed into the dictionary is of type PcnWeb.Models.Device , but this dictionary requires a model item of type PcnWeb.Models.IPAddress .

Voici mon modèles:

Adresse IP modèle:

namespace PcnWeb.Models 
{ 
    public class IPAddress 
    { 
     public virtual ICollection<Device> Devices { get; set; } 
     [Key] 
     public int ipAddressRecId { get; set; } 

     public Nullable<int> ipOctet1 { get; set; } 
     public Nullable<int> ipOctet2 { get; set; } 
     public Nullable<int> ipOctet3 { get; set; } 
     public Nullable<int> ipOctet4 { get; set; } 

     public Nullable<int> smOctet1 { get; set; } 
     public Nullable<int> smOctet2 { get; set; } 
     public Nullable<int> smOctet3 { get; set; } 
     public Nullable<int> smOctet4 { get; set; } 
    } 
} 

et le modèle de l'appareil:

namespace PcnWeb.Models 
{ 
    public class Device 
    { 
     [Key] 
     public int deviceRecId { get; set; } 

     public int ipAddressRecId { get; set; } 

     [Required, StringLength(64)] 
     [Unique] 
     public string Name { get; set; }   

     [StringLength(256)] 
     public string Comment { get; set; } 

     public virtual IPAddress IPAddress { get; set; } 
    } 
} 

je l'aurais pensé que ce serait assez facile d'avoir la page de création de dispositif associé à une page de création de ipaddress en ligne.

est ici la page de l'appareil:

@model PcnWeb.Models.Device 

@{ 
    ViewBag.Title = "Create a Device"; 
} 

<h2>Create</h2> 


@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Device</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ipAddressRecId, "IPAddress") 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("ipAddressRecId", String.Empty) 
      @Html.ValidationMessageFor(model => model.ipAddressRecId) 
     </div> 
     @{ 
      Html.RenderPartial("~/Views/IP_Address/_Create.cshtml"); 
     } 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name, "Name") 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Comment, "Comment") 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Comment) 
      @Html.ValidationMessageFor(model => model.Comment) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

Voici l'adresse IP partielle:

EDIT: Désolé j'ai oublié d'inclure ce

@model PcnWeb.Models.IPAddress

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>IPAddress</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ipOctet1, "ipOctet1") 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.ipOctet1) 
      @Html.ValidationMessageFor(model => model.ipOctet1) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ipOctet2, "ipOctet2") 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.ipOctet2) 
      @Html.ValidationMessageFor(model => model.ipOctet2) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ipOctet3, "ipOctet3") 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.ipOctet3) 
      @Html.ValidationMessageFor(model => model.ipOctet3) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ipOctet4, "ipOctet4") 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.ipOctet4) 
      @Html.ValidationMessageFor(model => model.ipOctet4) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.smOctet1, "smOctet1") 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.smOctet1) 
      @Html.ValidationMessageFor(model => model.smOctet1) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.smOctet2, "smOctet2") 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.smOctet2) 
      @Html.ValidationMessageFor(model => model.smOctet2) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.smOctet3, "smOctet3") 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.smOctet3) 
      @Html.ValidationMessageFor(model => model.smOctet3) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.smOctet4, "smOctet4") 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.smOctet4) 
      @Html.ValidationMessageFor(model => model.smOctet4) 
     </div> 

    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

Donc de tout cela, ça me va bien, la validation fonctionne côté client. Je vais devoir écrire du javascript pour cacher l'adresse IP partielle à moins qu'ils ne choisissent de nouveau dans la liste déroulante.

Voici à nouveau la question, Comment puis-je corriger cette erreur:

The model item passed into the dictionary is of type PcnWeb.Models.Device , but this dictionary requires a model item of type PcnWeb.Models.IPAddress .

Répondre

0

Cette erreur signifie qu'il ya incompatibilité entre le type de modèle dans votre vue partielle et le type de modèle est passé à ce point de vue. Mais comme je peux vous voir essayer de rendre la vue partielle sans passer le modèle.
Votre exemple de code a fonctionné pour moi. Donc, pour résoudre ce problème, vous pouvez faire les étapes suivantes.

  1. Assurez-vous que le chemin de vue est correct;).
  2. Essayez donc 'envoyer' modèle à votre vue partielle comme explicity

vue principale

@model PcnWeb.Models.Device 
//some code here 
@Html.Partial("path_to_view", Model) 

vue partielle.

@model PcnWeb.Models.Device 
@Html.DropdownListFor(x=>x.ipAddressRecId, YourDlistSource) //or anything you need 

Cela fonctionne pour moi.

Alternativement, si vous avez besoin modifier en sous-modèle vue partielle, vous pouvez le faire

@model PcnWeb.Models.Device 
    //some code here 
    @Html.Partial("path_to_view", Model.IPAddress)//pass the submodel to partial view 

alors votre vue partielle doit être avec un autre type.

@model PcnWeb.Models.IPAddress 

    //some code here 

Réponse sur le commentaire. Pour résoudre l'exception de référence d'objet, essayez d'initialiser votre sous-modèle dans le constructeur.

public class Device 
{ 
///properties 
    public Device() 
    { 
     IPAddress = new IPAddress(); 
    } 
} 
+0

Je suis confus lorsque vous dites que l'exemple a fonctionné pour vous. Avez-vous essayé de soumettre le formulaire? Je vais ajouter la vue partielle de l'adresse IP ci-dessus. – TechplexEngineer

+0

Lorsque j'essaie de faire ceci '' '@ Html.Partial (" path_to_view ", Model.IPAddress)' '' Je reçois cette erreur: '' 'La référence de l'objet n'est pas définie sur une instance d'un objet.'' avoir à faire quelque chose de fantaisie dans le contrôleur? – TechplexEngineer

+0

a modifié mon post – maxs87