3

次のように、インデックスページに PartialView があります:-

@{ Html.RenderPartial("ImageUpload"); }

PartialView は次のようになります:-

@model MvcCommons.ViewModels.ImageModel

<p>
   @Html.ActionLink("Create New", "Create")
</p>
<table>
    @foreach (var item in Model) {
      <tr>
        <td>
          @Html.DisplayFor(modelItem => item.FileName)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Description)
        </td>
      </tr>
    }
</table>

PartialView の上部にある宣言によると、ViewModels.ImageModel 内に入るはずであり、そのクラス内にコンストラクターがあります:-

public ImageModel()
{
   XDocument imageMetaData = XDocument.Load(uploadsDir + @"/ImagesMetaData.xml");
   var images = from image in imageMetaData.Descendants("image")
                select new Image(image.Element("filename").Value,
                image.Element("description").Value);
   this.AddRange(images.ToList<Image>());
}

ただし、何らかの理由で、ImageUpload 部分ビューでデバッグすると、この ViewModel コンストラクターにリダイレクトされないため、PartialView 内のモデルが null になります。

ここで何か不足していますか?

実際にコンストラクターを通過させるにはどうすればよいですか? メインのインデックス ページ (PartialView をホストしている場所) でも @model を実行する必要がありますか?

あなたの助けと時間をありがとう

4

2 に答える 2

4

この行@model MvcCommons.ViewModels.ImageModelは、厳密に型指定されたモデルを宣言するために使用されますが、インスタンス化するためには使用されません。

使用する必要があります

@{ Html.RenderPartial("ImageUpload", <yourmodel>); }

またはより単純な:

@Html.Partial("ImageUpload", <yourmodel>)

ちなみに、あなたの場合:

@Html.Partial("ImageUpload", new ImageModel())

ただし、注意してください。モデルはコンストラクターがなく、XML の読み込み/解析を行わないようにする必要があります。これはコントローラーで行う必要があります(そしてキャッシングシステムで設定しますか?)。

メイン ビューのモデルを少なくしたい場合は、部分レンダリング用の属性 ChildActionOnly を使用してアクションを作成し、それを で呼び出すこともでき@Html.Action(...)ます。これにより、新しい ControllerContext が作成されます。

于 2012-06-01T10:22:41.400 に答える
3

部分ビューのモデルを設定していません。http://msdn.microsoft.com/en-us/library/dd492962.aspxを参照してください。

@{ Html.RenderPartial("ImageUpload", myModel); }

モデルを作成するのはビューの責任ではありません。部分ビューを含むビューの関連コントローラーでこれをインスタンス化する必要があります。

于 2012-06-01T10:07:58.560 に答える