2009-03-09 25 views
0

mit einem Problem beim Übergeben von ViewData.Model zu den Teilansichten. Es ist immer standardmäßig Null, auch wenn ich es einer Ergebnisabfrage gleichsetze. Ich kann nicht auf die stark typisierten Daten zugreifen, da das Modell null ist. Meine aktuellen Code ist das,stark typisierte Teilansichten MVC RC1

View

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

Usercontrol - header

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

Usercontrol - Test

<%@ 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") %> 

    <%} %> 

-Controller

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

Sind alle Ansichten zu Models.information stark typisierte? Welches Steuerelement gibt die ViewPage zurück? – liammclennan

+0

Ich habe die Views nur Teiltöne nicht stark typisiert. – Ayo

Antwort

2

In den Kommentaren haben Sie gesagt, dass die Ansicht nicht stark typisiert ist. Aus diesem Grund:

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

wird nicht funktionieren. Wenn Sie Ihre Ansicht stark in testMVCProject.Models.information eingeben und dann eine Instanz dieses Typs von Ihrem Konstruktor übergeben, funktioniert sie.

Controller:

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

Da ich Teilbereiche in meiner gesamten Ansicht verwende, wenn ich neue Teilinformationen zu den Partials hinzufügen möchte, beschränke ich mich nur auf das, was von der Viewpage selbst übergeben wird, oder kann ich mich darauf beschränken, nur Teilbereiche zu sein? – Ayo

+0

Partials können nur ihre Daten aus der Ansicht abrufen. Siehe Justins Antwort. – liammclennan

-1

Ich glaube, das Problem könnte sein, dass Sie ein Element im Formular mit dem Namen "ID" fehlt, so dass der Parameter der Methode Aktion nie mit einem Wert gefüllt wird?

Auf diese Weise die Abfrage würde immer Null mit dem FirstOrDefault zurück, daher das Null-Modell.

nur meine Vermutung ...

0

Haben Sie versucht, die Viewgenerische als auch machen?

0

der Controller nicht genannt wird erhalten, wenn Sie RenderPartial - es umgangen wird und der Blick wird direkt wiedergegeben. Also alles, was Sie als Modell übergeben möchten, muss von der aufrufenden Ansicht aus geschehen.

+0

woher haben Sie diese Informationen erhalten, ich bin mir ziemlich sicher, dass ich auf den Controller zugreifen kann, wenn ich die renderpartial-Methode aufrufen – Ayo

+0

Aus eigener Erfahrung. Wenn Sie RenderPartial ("viewName") aufrufen, versucht die Ansichts-Engine nicht, eine Controller-Methode aufzurufen - sie sucht nach einer Ansicht namens "viewName". Probieren Sie es aus ... Sie können die Standardansichts-Engine möglicherweise überschreiben, um Controller zu verwenden ...? – Justin

1

Sie haben ein Missverständnis über die Verwendung von Html.RenderPartial Helfer. Wenn Sie das RenderPartial verwenden, zeigen Sie die Ansicht an, ohne das Modell vom Controller anzufordern.

So haben Sie Ihre View Refactoring und das gute Modell zu Ihrem Benutzersteuerelemente passieren:

Exemple:

Controller:

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

Code anzeigen:

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

anzeigen Code hinter

public partial class MainView : ViewPage<MainViewObject> 
{ 
} 

Jetzt ist das Modell in Ihrem Benutzersteuerelement nicht null. Aber denken Sie daran, die Usercontrol teilweise dun den Code in der Steuerung ausführen Rendering So müssen Sie dun die public ActionResult header(int id) in der Controller

hoffe, das hilft.

+0

Ich versuche Codebehind-Dateien zu vermeiden, und ich bin nicht sicher, ob dieses Appraach für dynamische Model-Überladungen funktioniert – Ayo

0

Ich fand, dass dies für mich funktionierte, referenzieren Sie die teilweise als Sie, so.

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

in der Teilansicht an der Spitze ...

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

     ViewData.TemplateInfo.HtmlFieldPrefix = "AboutYou"; 

     if (this.ViewContext.FormContext == null) 
     { 
      this.ViewContext.FormContext = new FormContext(); 
     } 
    } 
Verwandte Themen