[C#][MVC5] Partial View , Object reference not set to an ins

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • amx
  • Registratie: December 2007
  • Laatst online: 13-10 22:39
Ik ben bezig om een partial view in een view te zetten.

De partial view heet Partialtest1.cshtml.
Wanneer ik de partial view invoeg in test1.cshtml werkt het.
Test1 bevindt zich in de map ~/Views/Test1
Test1 wordt aangestuurd door test1Controller.cs

Wanneer ik de partial view probeer te laden in een andere view werkt het niet.
De andere view heet test2.cshtml.
Test2 bevindt zich in de map ~/Views/Test2
Test2 wordt aangestuurd door test2Controller.cs

De code die ik gebruik om de partial view in te laden is:
code:
1
@Html.Partial("~/Views/Test1/Partialtest1.cshtml", Model)



De tweede waarde Model verwijst naar code uit Partialtest1
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Naam)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Omschrijving)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Servernaam)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.IP_adres)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Poort)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Naam)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Omschrijving)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Servernaam)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.IP_adres)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Poort)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
            @Html.ActionLink("Details", "Details", new { id=item.Id }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.Id })
        </td>
    </tr>
}

</table>


Wanneer ik het project opstart, komt er een foutmelding bij de volgende regel:

[code]
@foreach (var item in Model)
/code]

de foutmelding is:
code:
1
2
3
An exception of type 'System.NullReferenceException' occurred in App_Web_partialtest1.cshtml.63193c51._3fdxryg.dll but was not handled in user code

Additional information: Object reference not set to an instance of an object.


Ik heb gekeken naar wat de foutmelding kan veroorzaken, maar ik zie niet direct wat ervoor zorgt dat het wel werkt bij test1 en niet bij test2. Via Google vindt ik op de foutmeldingen geen verklaring hiervoor.

Acties:
  • 0 Henk 'm!

Verwijderd

De uitzondering geeft al aan dat je aan een object refereert wat null is.
Als je gaat debuggen en een breakpoint zou zetten waar Model zou moeten worden toegewezen dan zou je moeten zien dat deze nog null is na de toewijzing?
Dus om de één of andere reden blijft deze dus null terwijl jij waarschijnlijk verwachtte dat Model data bevat.

Nu kun je twee dingen doen.
1: de uitzondering afvangen en afhandelen, maar dat is niet gewenst in dit geval denk ik?
2: kijken waarom Model null blijft en dit corrigeren.

Acties:
  • 0 Henk 'm!

  • amx
  • Registratie: December 2007
  • Laatst online: 13-10 22:39
Misschien nog handig om te vermelden: de bedoeling is dat Partialtest1 en test2 beide verschillende modellen aanspreken. Ik maak gebruik van een database die als ADO.NET Entity Data Model is geïmporteerd.

Ik zoek dus eigenlijk als ik het goed begrijp een methode om informatie uit twee verschillende modellen samen te voegen in een enkele view.

[edit]

Ik denk dat ik doorheb waarom ik hier deze foutmelding krijg. Ik heb het probleem nog eens proberen te reproduceren, ik denk dat in de controller de oplossing zit.
Ik heb na mijn post een nieuw project gemaakt, gebruikmakend van de standaard MVC 5 template. Daarbij heb ik alleen het ADO Entity Data Model aangemaakt, en de partial view. De homecontroller en index.cshtml zijn al door Visual Studio aangemaakt. In de controller heb ik 2 dingen aangepast, ik heb de volgende regel aangemaakt om in de controller naar het Entity Data Model te kunnen verwijzen;

code:
1
private TestDBEntities db = new TestDBEntities();


Ook heb ik de Actionresult aangemaakt voor de partial view om te kijken of het als ik de view rechtstreeks aanspreek via de browser het wel werkt.

code:
1
2
3
4
 public ActionResult Partialtest1()
        {
            return View(db.Partialtest1);
        }


In de Index.cshtml view heb ik geen verwijzing @model , dus bij de verwijzing @Html.partial staat nu alleen nog de locatie van de partial view. Omdat ik vanuit de Homecontroller werk is ook de map aangepast.

code:
1
@Html.Partial("~/Views/Home/Partialtest1.cshtml")


Het werkt nu als ik de partial view rechtstreeks aanspreek.
Het werkt ook als ik in de controller bij Actionresult van index de partial view specifiek aanroep.

code:
1
2
3
4
5
public ActionResult Index()
        {
            
            return View(db.test1);
        }


Ik vermoed dus dat ik een variable aan moet maken binnen de Actionresult. Zonder dat ik de View specificeer blijft Model null aanroepen in de partial view.

Kan iemand hier aangeven of ik in de goede richting aan het denken ben?

(Waar in de openingspost werd verwezen naar de view test2 kan nu index gelezen worden)

[ Voor 72% gewijzigd door amx op 31-05-2015 13:50 ]


Acties:
  • 0 Henk 'm!

  • amx
  • Registratie: December 2007
  • Laatst online: 13-10 22:39
Iemand? Ik vind veel voorbeelden op internet, maar geen een die precies aan de generieke beschrijving voldoet.

Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:59
Als je een partial view wilt gebruiken, moet je ook een partial view returnen:
C#:
1
2
3
4
public ActionResult Partialtest1()
{
    return PartialView(db.Partialtest1);
}

Je action geeft nu "volledige" views terug.

Verder: als je een partial view wilt hergebruiken kun je twee dingen doen:
Je geeft het model mee vanuit je view (het model voor je partial view zit dus in je hoofd viewmodel, geen action in de controller nodig):
C#:
1
2
3
4
// Index.cshtml
@model HoofdViewModel

@Html.Partial("PartialTest1", Model.PartialViewModel)


• Je rendert de partial view vanuit je view:
C#:
1
2
// Index.cshtml
@{ Html.RenderAction("HomeController", "PartialTest1");}

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • amx
  • Registratie: December 2007
  • Laatst online: 13-10 22:39
code:
1
@{ Html.RenderAction("HomeController", "PartialTest1");}
Dank je _/-\o_ , de syntax is omgekeerd (view, controller), maar dit doet precies wat ik wil.

Acties:
  • 0 Henk 'm!

  • InZane
  • Registratie: Oktober 2000
  • Laatst online: 14:43
amx schreef op donderdag 04 juni 2015 @ 08:35:
[...]


Dank je _/-\o_ , de syntax is omgekeerd (view, controller), maar dit doet precies wat ik wil.
Eigenlijk is de syntax (action, controller). De view kan best een heel ander naampje hebben :)

Acties:
  • 0 Henk 'm!

  • amx
  • Registratie: December 2007
  • Laatst online: 13-10 22:39
Interessant, ik dacht dat als je voor index.cshtml een actionresult maakte, de action ook daadwerkelijk Index moest heten. Of bedoel je dat niet?

Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:59
Je maakt geen actionresult voor je index.cshtml. Je maakt een action, "Index", en die returned een view. Als je dat zo doet:
code:
1
return View(model);

Gaat MVC op zoek naar een view genaamd Index. Maar je kan net zo goed een andere view teruggeven:
code:
1
2
3
4
if(DateTime.Now.Hour <= 12)
  return View(model);
else
  return View("IndexVoorNaDeLunch", model);

Roomba E5 te koop

Pagina: 1