2014-10-03 64 views
1

我有一个名为Title的枚举类型字段。剃刀视图中所需的值类型字段

[Serializable] 
public enum Title 
{ 
    NotSet, 
    Miss = 4, 
    Mr = 1, 
    Mrs = 3, 
    Ms = 2 
} 

我想Title类型的Razor视图属性绑定,但我不希望它是一个必填字段。然而,在TabBut Out或OnBlur上,它会根据需要显示,虽然我没有指定这是required

有什么办法可以解决这个问题吗?

+0

一个枚举必须有一个值,这就是为什么它是必需的。你总是可以让它为空 - “公开标题?标题{get;组; }' – 2014-10-04 10:52:58

+0

为什么不添加这个正确的评论作为答案? – JotaBe 2014-10-05 16:37:00

回答

1

在模型

public Title? Titleformation { get; set; } 
    public string[] SelectedTitle { get; set; } 
在你看来

创建

namespace YourApplicationName.Helper 
    { 
    public class ModelValueListProvider : IEnumerable<SelectListItem> 
    { 
    List<KeyValuePair<string, string>> innerList = new List<KeyValuePair<string, string>>(); 
    public static readonly ModelValueListProvider TitleList = new TitleListProvider(); 
    protected void Add(string value, string text) 
    { 
     string innerValue = null, innerText = null; 

     if (value != null) 
      innerValue = value.ToString(); 
     if (text != null) 
      innerText = text.ToString(); 

     if (innerList.Exists(kvp => kvp.Key == innerValue)) 
      throw new ArgumentException("Value must be unique", "value"); 

     innerList.Add(new KeyValuePair<string, string>(innerValue, innerText)); 
    } 
    public IEnumerator<SelectListItem> GetEnumerator() 
    { 
     return new ModelValueListProviderEnumerator(innerList.GetEnumerator()); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    private struct ModelValueListProviderEnumerator : IEnumerator<SelectListItem> 
    { 
     private IEnumerator<KeyValuePair<string, string>> innerEnumerator; 

     public ModelValueListProviderEnumerator(IEnumerator<KeyValuePair<string, string>> enumerator) 
     { 
      innerEnumerator = enumerator; 
     } 

     public SelectListItem Current 
     { 
      get 
      { 
       var current = innerEnumerator.Current; 
       return new SelectListItem { Value = current.Key, Text = current.Value }; 
      } 
     } 

     public void Dispose() 
     { 
      try 
      { 
       innerEnumerator.Dispose(); 
      } 
      catch (Exception) 
      { 
      } 
     } 

     object System.Collections.IEnumerator.Current 
     { 
      get 
      { 
       return Current; 
      } 
     } 

     public bool MoveNext() 
     { 
      return innerEnumerator.MoveNext(); 
     } 

     public void Reset() 
     { 
      innerEnumerator.Reset(); 
     } 
    } 
    private class TitleListProvider : ModelValueListProvider 
    { 
     public TitleListProvider (string defaultText = null) 
     { 
      if (!string.IsNullOrEmpty(defaultText)) 
       Add(string.Empty, defaultText); 

      Add(Title.NotSet, "NotSet"); 
      Add(Title.Miss , "Miss"); 
      Add(Title.Mr , "Mr"); 
      Add(Title.Mrs , "Mrs"); 
      Add(Title.MS, "MS"); 


     } 
     public void Add(Title value, string text) 
     { 
      Add(value.ToString("d"), text); 
     } 
    } 
    } 
} 

,也命名空间添加到您的视图

 @using YourApplicationName.Helper; 
    @Html.ListBoxFor(m => m.SelectedTitle , new SelectList(ModelValueListProvider.TitleList, "Value", "Text")) 

希望这对你有所帮助

-1

使用类而不是枚举即:

public class Title 
{ 
    NotSet; 
    Miss = 4; 
    Mr = 1; 
    Mrs = 3; 
    Ms = 2; 
} 
+0

-1:除了没有意义,这段代码甚至没有编译。 – JotaBe 2014-10-05 16:36:23

0

枚举需要值,不能为空(也可以不设置),尽管上面有人评论过。我所做的致谢有一个“无”的枚举成员,每当我打印出来,我只是检查代码,以查看枚举值是否> 0(也就是none选项),并且不'打印它。

public enum Salutation { none, 
         [Description("Mr.")] Mr, 
         [Description("Mrs.")] Mrs, 
         [Description("Ms.")]Ms, 
         [Description("Miss")] Miss }