通过属性c#解析字符串值

时间:2014-05-07 07:12:29

标签: c# asp.net-mvc custom-attributes

我正在使用ASP.NET MVC,我有以下模型类:

public enum ListType
{
    black,
    white
}
public class ListAddSiteModel : ApiModel
{
    [RequestParameter]
    public ListType list { get; set; }
}

但它不按我想要的方式工作。当我没有在请求的URL中传递list参数时,我的列表是black。但我希望如果list参数不是blackwhite字符串,那么list必须为null。是否可以编写自定义属性[IsParsable],只需将其添加到列表属性即可。

public class ListAddSiteModel : ApiModel
{
    [RequestParameter]
    [IsParsable]
    public ListType list { get; set; }
}

2 个答案:

答案 0 :(得分:4)

轻松出路:

public enum ListType
{
    novalue = 0, 
    black,
    white
}

虚拟必须是第一个(映射到0 == default(Enum)

答案 1 :(得分:2)

传递黑色或白色的值的唯一方法是传递int。您可以通过在调用Enum.IsDefined的setter中添加一个检查来阻止这种情况,例如:

ListType? _listType;
public ListType? List
{
    get
    { 
        return _listType;
    }
    set
    {
        //Enumb.IsDefined doesn't like nulls
        if (value==null || Enum.IsDefined(typeof(ListType),value))
            _listType=value;
        else
            _listType=null;
    }
}

你也可以将它与Henk Holterman的答案结合起来,并在你的枚举中添加一个等于0的NA成员。这可能会使您的代码更容易阅读。

在这两种情况下,您的代码都必须处理特殊值(NAnull)。使用可空类型会让人更难忘记这一点,但是会稍微丢掉你的代码。