Razor View中需要的值类型字段

时间:2014-10-03 20:32:57

标签: asp.net-mvc-4 razor knockout.js

我有一个名为Title的枚举类型字段。

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

我想将类型为Title的属性绑定到Razor View,但我不希望它是必填字段。但是,在Tabbing out或OnBlur上,它会根据需要显示,但我未指定这是required

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

3 个答案:

答案 0 :(得分:1)

创建

  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);
        }
    }
  }
 }

在您的模型中

    public Title? Titleformation { get; set; }
    public string[] SelectedTitle { get; set; }
在您的视图中

,还要在视图中添加名称空间

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

希望这能帮到你

答案 1 :(得分:0)

枚举需要值,并且不能为空(也就是未设置),尽管有人在上面评论过。我所做的致敬是有一个&#34;没有&#34;枚举的成员,每当我打印出来时,我只需检查代码,看看枚举的值是否为&gt; 0(也就是说,无选项)并且不打印它。

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

答案 2 :(得分:-1)

使用类而不是枚举,即:

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