2017-02-10 44 views
3

我试图做这在我的Razor视图:通行证可空布尔值,局部视图不工作时值为null

@{ Html.RenderPartial("_Checkbox", Model.SomeNullableBoolean); } 

_Checkbox.cshtml:

@model bool? 

@if (Model == null) 
{ 
    Some code 
} 
else if (Model == true) 
{ 
    Some other code 
} 

这工作得很好,只要因为Model.SomeNullableBoolean设置为truefalse。 但是,如果该值为null我收到以下错误:

The model item passed into the dictionary is of type 'System.Data.Entity.DynamicProxies.MyAwesomeModel_EB6A12E11ECADA2C6B22289ACDF73813854383896F2E78956FDFFE6225F0404F', but this dictionary requires a model item of type 'System.Nullable`1[System.Boolean]'.

模型内部可空属性(MyAwesomeModel)的定义是这样的:

public bool? SomeNullableBoolean { get; set; } 

任何想法如何,我应该作进一步调查?

+0

据我所知,布尔不能为空。 – Pavvy

+1

当您将模型传递给部分为null的模型时,默认情况下它将在主视图中传递模型(在您的示例中为'MyAwesomeModel' –

+2

)您可以改为传递一个新的'ViewDataDictionary'(使用[this overload ](https://msdn.microsoft.com/en-us/library/system.web.mvc.html.partialextensions.partial(v = vs.118)的.aspx#L:System.Web.Mvc.Html.PartialExtensions .Partial%28System.Web.Mvc.HtmlHelper,System.String,System.Web.Mvc.ViewDataDictionary%29)) –

回答

1

当你传递一个模型部分是null,默认情况下将使用模型的主视图,所以在你的情况下,其传球和实例MyAwesomeModel的观点,即需要一个模型,它是bool?(因此错误)。

您需要有条件地通过一项新的ViewDataDictionary如果属性的值是null

@{ Html.RenderPartial("_Checkbox", Model.SomeNullableBoolean.HasValue ? 
    new ViewDataDictionary(){ Model = Model.SomeNullableBoolean } : 
    new ViewDataDictionary()); } 
1

我跟随斯蒂芬·马克的建议,并与ViewDataDictionary办法去:

@{ Html.RenderPartial("_Checkbox", null, new ViewDataDictionary { { "BoolValue", Model.SomeNullableBoolean}}); } 

_Checkbox.cshtml:

@{ 
    var theValue = (bool?) ViewData["BoolValue"]; 
} 

@if (theValue == null) 
{ 
    something 
} 
else if (theValue == true) 
{ 
    something 
} 
else 
{ 
    something 
} 

这工作完全!