0

この種の質問をする人はたくさんいると思いますが、私はそれをどのように表現すればよいかわかりません.

説明してみます。デバイスが IP アドレスを持つイーサネット ネットワークをモデル化する作業を行っています。システム全体で一意性を確保するために、IP とサブネットが別のテーブルに格納されるように、エンティティ フレームワーク モデルをセットアップしました。

必要な IP がドロップダウン リストにない場合、ユーザーがデバイスとそれに関連付けられた IP を同時に作成できるようにしたいと考えています。

デバイス ページで IP アドレス ページ RenderPartial の一部を設定すると、次のエラーが発生します。

ここに質問があります。このエラーを修正するにはどうすればよいですか。

ディクショナリに渡されたモデル アイテムのタイプは ですPcnWeb.Models.Deviceが、このディクショナリにはタイプ のモデル アイテムが必要PcnWeb.Models.IPAddressです。

ここに私のモデルがあります:

IP アドレス モデル:

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; }
    }
}

そしてデバイスモデル:

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; }
    }
}

関連付けられたデバイス作成ページとインライン IP アドレス作成ページを用意するのはかなり簡単だと思っていたでしょう。

デバイス ページは次のとおりです。

@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>

IP アドレスの一部は次のとおりです。

編集:申し訳ありませんが、これを含めるのを忘れていました

@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>

以上のことから、私には素晴らしいように見えます。検証はクライアント側で機能します。ドロップダウン リストから新規を選択しない限り、部分的な IP アドレスを非表示にする JavaScript を作成する必要があります。

もう一度質問です。このエラーを修正するにはどうすればよいですか。

ディクショナリに渡されたモデル アイテムのタイプは ですPcnWeb.Models.Deviceが、このディクショナリにはタイプ のモデル アイテムが必要PcnWeb.Models.IPAddressです。

4

1 に答える 1

0

このエラーは、部分ビューのモデル タイプと、このビューに渡されたモデルのタイプが一致していないことを意味します。しかし、私が見ることができるように、モデルを渡さずに部分ビューをレンダリングしようとしています。
あなたのコード例は私にとってはうまくいきました。

したがって、この問題を解決するには、次の手順を実行できます。

  1. ビューパスが正しいことを確認してください;)。
  2. モデルを部分ビューに明示的に「送信」してみてください

メインビュー

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

部分的なビュー。

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

これは私にとってはうまくいきます。

あるいは、部分ビューでサブモデルを編集する必要がある場合は、これを行うことができます

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

部分ビューは別のタイプでなければなりません。

    @model PcnWeb.Models.IPAddress

    //some code here

コメントで答えます。オブジェクト参照の例外を解決するには、コンストラクターでサブモデルを初期化してみてください。

public class Device
{
///properties
    public Device()
    {
        IPAddress = new IPAddress();
    }
}
于 2013-07-09T07:18:33.357 に答える