billy jean
billy jean

Reputation: 1419

Handling null models in partials and null model values

i am having problems figuring out how to handle nulls when passing models to partials as well handling null values in models.

In this block:

@section TaskBar{
     @Html.Partial("_TaskBar", Model);
}

I get this error: e:\Views\Shared_TaskBar.cshtml(107): error CS1002: ; expected

???

also, having problem with nulls in the partial

I've tried: this.userID = ko.observable("@if(Model.UserID == null){"null"}else{Model.UserID}");

and

this.userID = ko.observable("@(Model.UserID == null)?"null" :Model.UserID");

with ; etc...

So my question is.. my partial will often be passed a null model.. so how to handle the partial method and if null how to handle in the view? thanks!

Upvotes: 3

Views: 15548

Answers (2)

Iridio
Iridio

Reputation: 9271

I don't clearly understand what you mean with Model null, because your example check if UserId is null and not the Model itself. So, assuming you mean to check the entire Model, personally I will use a simple if at the start of my view. Something like this

 @model MyViewModel
 @if (Model != null) {
 <div>
    @Model.UserId
 </div>
 }

Or when you define the RenderSection pass the Required=false so when declaring the section, you can selectively do that if the model has value or not.

In your layout.cshtml

@RenderSection("Taskbar", false)

In your pages

 @if (Model != null) {
   section TaskBar{
     @Html.Partial("_TaskBar", Model);
   }
 }

Upvotes: 10

Boris Yankov
Boris Yankov

Reputation: 1540

In order to simplify your code you should utilize the Null Object pattern.

Instead of using null to represent a non existing value, you use an object initialized to empty/meaningless values. This way you do not need to check in dozens of places for nulls and get NullReferenceExpections in case you miss it.

There is even a simpler approach, derived from this. Instead of creating a specific NullObject class, just pass a new instance of the class you require. If it is a simple ViewModel, this usually is enough, since C# already initializes the values for you, and is likely what you want most of the time.

Upvotes: 3

Related Questions