Templates MVC4-字符串自定义模板与枚举混淆
我有一个自定义模板Templates MVC4-字符串自定义模板与枚举混淆,templates,asp.net-mvc-4,razor,enums,Templates,Asp.net Mvc 4,Razor,Enums,我有一个自定义模板~/Views/Shared/EditorTemplate/String.cshtml,它似乎导致了异常: The model item passed into the dictionary is of type 'Proj.Models.EnumType', but this dictionary requires a model item of type 'System.String'. 这似乎只发生在enum上。如果我删除模板,它也会消失。模板似乎并没有导致它,我认为它
~/Views/Shared/EditorTemplate/String.cshtml
,它似乎导致了异常:
The model item passed into the dictionary is of type 'Proj.Models.EnumType', but this dictionary requires a model item of type 'System.String'.
这似乎只发生在enum
上。如果我删除模板,它也会消失。模板似乎并没有导致它,我认为它甚至没有达到那个程度。我可以在里面放任何东西,例外情况也是一样的
所以。。。如果我有一个自定义模板
,我不能将@Html.EditorFor
与模型
和枚举一起使用吗
一些背景:
型号:
namespace Proj.Models
{
public enum EnumType
{
A = 0,
B = 1,
C = 2,
}
public class Mod
{
[Required]
public String Name;
[Required]
public EnumType Letter;
}
}
视图:
这是我发现对我有用的东西
在模板中,确保将模型声明为可为空的枚举类型。然后,在代码中,检查它是否有值,并根据该值进行适当的格式化
@inherits System.Web.Mvc.WebViewPage<Proj.Models.EnumType?>
@{
Proj.Models.EnumType v = Model.HasValue ? Model.Value : {*some-default-value*};
@Html.{*Your-formatter-here*};
}
@继承System.Web.Mvc.WebViewPage
@{
Proj.Models.EnumType v=Model.HasValue?Model.Value:{*某些默认值*};
@Html.{*您的格式化程序在这里*};
}
以下是我找到的适合我的工作
在模板中,确保将模型声明为可为空的枚举类型。然后,在代码中,检查它是否有值,并根据该值进行适当的格式化
@inherits System.Web.Mvc.WebViewPage<Proj.Models.EnumType?>
@{
Proj.Models.EnumType v = Model.HasValue ? Model.Value : {*some-default-value*};
@Html.{*Your-formatter-here*};
}
@继承System.Web.Mvc.WebViewPage
@{
Proj.Models.EnumType v=Model.HasValue?Model.Value:{*某些默认值*};
@Html.{*您的格式化程序在这里*};
}
您确实需要提供更多的上下文。你的模特长什么样?您的视图和模板是什么样子的?您的控制器操作方法是什么样子的?首先,必需的属性是没有意义的,因为枚举是一种值类型,它们不能为Null,因此它们总是有一个值,因此永远不会通过必需的验证。其次,您希望EditorFor对枚举做什么?没有“枚举选择器”方法。最后,您实际上没有提供模型类型。@MystereMan:我认为Mod
类就是模型。我有客户端验证所需的数据。如果没有模板,它只会显示一个文本框,我可以在其中输入我想要的名称。这不是它的工作方式。您不能输入枚举的名称并让它神奇地工作。枚举实际上是一个int(这就是它的值为0、1、2等的原因)。您的EditorTemplate正在使用字符串。。如果Mod是您的模型,那么您应该指定Mod是您的模型,而不是将@model留空。至于必填字段,你没有听我说。枚举是一种值类型。它不能为null,因此验证是无意义的。如果将字段保留为空,它仍将包含默认值,验证不会失败。但是,最终结果是MVC不会将枚举解析为其文本表示形式。如果你想这样做,你必须自己写代码。看看这样的例子:你真的需要提供更多的上下文。你的模特长什么样?您的视图和模板是什么样子的?您的控制器操作方法是什么样子的?首先,必需的属性是没有意义的,因为枚举是一种值类型,它们不能为Null,因此它们总是有一个值,因此永远不会通过必需的验证。其次,您希望EditorFor对枚举做什么?没有“枚举选择器”方法。最后,您实际上没有提供模型类型。@MystereMan:我认为Mod
类就是模型。我有客户端验证所需的数据。如果没有模板,它只会显示一个文本框,我可以在其中输入我想要的名称。这不是它的工作方式。您不能输入枚举的名称并让它神奇地工作。枚举实际上是一个int(这就是它的值为0、1、2等的原因)。您的EditorTemplate正在使用字符串。。如果Mod是您的模型,那么您应该指定Mod是您的模型,而不是将@model留空。至于必填字段,你没有听我说。枚举是一种值类型。它不能为null,因此验证是无意义的。如果将字段保留为空,它仍将包含默认值,验证不会失败。但是,最终结果是MVC不会将枚举解析为其文本表示形式。如果你想这样做,你必须自己写代码。参见以下示例: