Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC 4 Custom template for bool (razor)

I am using the twitter bootstrap framework, so to get the EditorFor and DisplayFor methods to output what I need, I created custom templates for each of the types like string, text, password etc. For my login page I want a RememberMe bool, so as before, I created the following template and put in in Boolean.cshtml:

@model bool

<div class="control-group">
    <div class="controls">
        <label class="checkbox">
            @Html.CheckBoxFor(m => m, new {@class = "checkbox"})
            @Html.LabelFor(m => m)
        </label>
    </div>
</div>

Pretty simple, but when I use:

@Html.EditorFor(m => m.RememberMe)

I get an exception saying the value being bassed cannot be null:

The model item passed into the dictionary is null, but this dictionary requires a non-null model item of type 'System.Boolean'.

What am I missing? Seems like it should be straight forward. The field on the model object looks like follows:

[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }

Thanks.

UPDATE: So it seems that in the end it's a matter of creating an empty view model object and passing it to the view instead of letting MVC create one on it's own.

like image 930
Tyrel Van Niekerk Avatar asked Jan 20 '13 15:01

Tyrel Van Niekerk


1 Answers

I would not do it that way. If the value can be null, I would make sure that your editor template has nullable boolean as the model type. So your editor template (in Views\Shared\EditorTemplates\Boolean.cshtml) would be:

@model Boolean?

@Html.CheckBox("", Model.HasValue && Model.Value)

And then in the razor of your main view, you could have:

<div class="control-group">
    <div class="controls">
        <label class="checkbox">
            @Html.EditorFor(m => m, new {@class = "checkbox"})
            @Html.LabelFor(m => m)
        </label>
    </div>
</div>
like image 55
Jonathan Avatar answered Sep 28 '22 12:09

Jonathan