When I assign a nullable integer to ViewBag, it un-nullables the value?

asp.net-mvc, asp.net-mvc-5, c#, nullable

Solution

I would suggest that you create a view model which will give you full flexibility to make "MyInt" a null-able type for this.

Of course, the alternative would be to only set "MyInt" if it is not null...

public class MyController : Controller {
    public ActionResult Index(int? id) {
        if (id.HasValue)
        {
            ViewBag.MyInt = id;
        }
        return View();
    }
}

View:

@if (ViewBag.MyInt != null)
{
    <p>Has an Id</p>
}
else
{
    <p>Has no Id.</p>
}

Personally, I would go with a viewmodel as it's best practice, I rarely use ViewBag unless its for a VERY simple scenario.

Problem

Consider this ASP.NET MVC 5 controller: ``` public class MyController : Controller { public ActionResult Index(int? id) { ViewBag.MyInt = id; return View(); } } ``` And this view: ``` <p>MyInt.HasValue: @MyInt.HasValue</p> ``` When I invoke the URL `/my/` (with a null id), I get the following exception: ``` An exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll but was not handled in user code Additional information: Cannot perform runtime binding on a null reference ``` Conversely, if I pass an ID in (eg, `/my/1`): ``` An exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll but was not handled in user code Additional information: 'int' does not contain a definition for 'HasValue' ``` This suggests to me that `ViewBag.MyInt` is not of type `Nullable<int>`, but of either `int` or `null`. Is this the ViewBag doing this? Or, is it something more fundamental about boxing Nullable types like this? Or, something else? Is there another way to do this? (I suppose that I could just change my check to `ViewBag.MyInt == null`, but let's pretend I really needed a `Nullable` type for some reason)

Original source

Related problems