2009-03-09 18 views
0

ViewData.Modelを部分ビューに渡す際に問題が発生しました。私はそれを結果クエリーと同じにしても、常にデフォルトになります。モデルがnullのため、厳密に型指定されたデータにアクセスできません。私の現在のコードは、この、強く型付けされた部分ビューMVC RC1

ビューページである

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <% Html.RenderPartial("header", this.ViewData.Model); %> 
    <% Html.RenderPartial("test", this.ViewData.Model); %> 
    <div id="userControls"> 
    </div> 
</asp:Content> 

ユーザーコントロール - ヘッダ

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<testMVCProject.Models.information>" %> 
<h2> 
    ACReport</h2> 
<p> 
    id: 
    <%= Html.Encode(Model.id) %> 
</p> 
<p> 
    type: 
    <%= Html.Encode(Model.type) %> 
</p> 

ユーザーコントロール - 試験

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<testMVCProject.Models.information>" %> 

     <% using (Ajax.BeginForm(
      "pressureV2", 
      "Home", 
      new { id = ViewData.Model.id }, 
      new AjaxOptions 
      { 
       UpdateTargetId = "userControls", 
       HttpMethod = "GET" 

      }, 
      new { @id = "genInfoLinkForm" })) 
      {%> 
     <%= Html.SubmitButton("hey", "Lol") %> 

    <%} %> 

コントローラ

public ActionResult header(int id) 
     { 
      var headerResults = from c in db.information 
           where c.id == id 
           select new information 
           { 
            id = c.id, 
            type = c.type 
           }; 
      ViewData.Model = headerResults.FirstOrDefault(); 
      return View(ViewData.Model); 
     } 

public ActionResult pressureV2(int id) 
     { 
      var pressureVResults = from c in db.pressure_volume_tests 
            where c.id == id 
            select new pressureVT 
            { 
             bottomCVP = c.bottom_CVP, 
             topCVP = c.top_CVP 
            }; 

      ViewData.Model = pressureVResults.FirstOrDefault(); 
      return View(ViewData.Model); 
     } 
+0

が強くModels.informationに型付けされたすべてのビューはありますか?どのコントロールがViewPageを返しますか? – liammclennan

+0

私は強くビューの一部だけをタイプしていません。 – Ayo

答えて

2

このコメントでは、表示が強く入力されていないと言いました。そのため:

<% Html.RenderPartial("header", this.ViewData.Model); %> 
<% Html.RenderPartial("test", this.ViewData.Model); %> 

は動作しません。 testMVCProject.Models.informationに厳密にビューを入力し、そのタイプのインスタンスをコンストラクタから渡すと、それが機能します。

コントローラー: - それはバイパスされ、ビューが直接レンダリングされますがれるrenderPartialとき

public ActionResult ShowAView() 
{ 
    Return View("WhateverYourViewIsCalled", new information()); 
} 
+0

私はパーシャルに新しいクエリ情報を追加したい場合、私はビュー全体にpartialsを使用しているので、ビューページ自体から渡されているものだけに制限されているのですか? – Ayo

+0

パーシャルはビューからのみデータを取得できます。ジャスティンの答えを見てください。 – liammclennan

-1

"id"という名前のフォームに要素がないため、Actionメソッドのパラメータに決して値が設定されない可能性があります。

このようにして、クエリは常にFirstOrDefault、つまりnullモデルでnullを返します。

ちょうど私の推測...

0

はあなたにもビューページには、一般的な作ってみましたがありますか?

0

コントローラが呼び出されません。だから、あなたがモデルとして渡したいものは、呼び出し元のビューから実行する必要があります。

+0

どこからこの情報を取得しましたか?レンダリング部分のメソッドを呼び出すときにコントローラにアクセスできることは確かです。 – Ayo

+0

個人的な経験から。 RenderPartial( "viewName")を呼び出すと、ビューエンジンはコントローラメソッドを呼び出そうとせず、 "viewName"というビューを探します。試してみてください... デフォルトのビューエンジンをオーバーライドしてコントローラを使用できるかもしれません...? – Justin

1

あなたはHtml.RenderPartialヘルパーを誤解しています。 RenderPartialを使用すると、コントローラからモデルを要求せずにビューが表示されます。

だから、あなたはあなたのビューページをリファクタリングして、ユーザーコントロールに優れたモデルを渡すことがあります。

Exemple:

コントローラー:

ActionResult MainView() 
{ 
    var mainviewobj = new MainViewObject(); 

    var headerResults = from c in db.information 
           where c.id == id 
           select new information 
           { 
            id = c.id, 
            type = c.type 
           }; 

    mainviewobj.info = headerResults.FirstOrDefault(); 

    return view(mainviewobj); 
} 

コードの表示:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <% Html.RenderPartial("header", this.ViewData.Model.info); %> 
    <% Html.RenderPartial("test", this.ViewData.Model.info); %> 
    <div id="userControls"> 
    </div> 
</asp:Content> 

見ますコードの背後

public partial class MainView : ViewPage<MainViewObject> 
{ 
} 

これで、モデルはユーザーコントロールではnullになりません。 しかし、ユーザーコントロールレンダリングの部分的なダンがコントローラ内のコードを実行することを覚えておいてください。あなたのコントローラにはおしゃべりが必要です。

+0

コードビハインドファイルを避けようとしていますが、このアプライアックが動的モデルのオーバーロードで機能するかどうかはわかりません – Ayo

0

私はこれが私のために働いていると分かりました。一番上の部分ビュー内

...form 
    @Html.Partial("_AboutYou", Model.AboutYou); 
..end form 

...

@model <namespace1>.<namespace2>.<namespace3>.CustomerInfo.AboutYou 
    @{ 

     ViewData.TemplateInfo.HtmlFieldPrefix = "AboutYou"; 

     if (this.ViewContext.FormContext == null) 
     { 
      this.ViewContext.FormContext = new FormContext(); 
     } 
    } 
関連する問題