从选定的枚举值构建枚举ASP.NET MVC

时间:2014-11-06 16:03:26

标签: c# asp.net-mvc-4 enums html.dropdownlistfor

我有一个枚举来保留帖子类型:

public enum PostType
{
    PostType1,
    PostType2,
    PostType3,
    PostType4,
    PostType5,
    PostType6
}

我还有一些用户角色,所以根据他们的角色,用户可以添加允许的帖子

所以我想从选定的枚举值中构建下拉列表。

例如: 对于UserType1,我的enum下拉列表将只有posttype1,对于UserType4,所有都是允许的。

如何在ViewModel中实现这一目标?

提前谢谢你......

2 个答案:

答案 0 :(得分:1)

试试这个,创建一个帮手

 namespace MvcApplication1.Helpers
{
public class ModelValueListProvider : IEnumerable<SelectListItem>
{
    List<KeyValuePair<string, string>> innerList = new List<KeyValuePair<string, string>>();

    public static readonly ModelValueListProvider PostTypeList = new PostTypeListProvider();

    public static ModelValueListProvider MethodAccessEnumWithRol(int id)
    {

        return new PostTypeListProvider(null, id);
    }


    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 PostTypeListProvider : ModelValueListProvider
    {
        public PostTypeListProvider(string defaultText = null, int rolId = 0)
        {
            if (!string.IsNullOrEmpty(defaultText))
                Add(string.Empty, defaultText);
            if (rolId == 1)
                Add(PostType.PostType1, "PostType1");
            else
            {
                Add(PostType.PostType2, "PostType2");
                Add(PostType.PostType3, "PostType3");
                Add(PostType.PostType4, "PostType4");
                Add(PostType.PostType5, "PostType5");
                Add(PostType.PostType6, "PostType6");
            }


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

        }
    }


}
  public enum PostType
   {
    PostType1,
    PostType2,
    PostType3,
    PostType4,
    PostType5,
    PostType6
    }
  }

然后在你的视图中

         @Html.DropDownListFor(m => Model.idRoleuser, new SelectList(MvcApplication1.Helpers.ModelValueListProvider.MethodAccessEnumWithRol(1), "Value", "Text"))
        @Html.DropDownListFor(m => Model.idRoleuser, new SelectList(MvcApplication1.Helpers.ModelValueListProvider.MethodAccessEnumWithRol(2), "Value", "Text"))
希望能帮助你

答案 1 :(得分:0)

你可以做这样的事情。

using System.Reflection;
using System.ComponentModel;
using System.Linq.Expressions;
namespace MvcApplication7.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            return View();
        }

    }

    public static class Helper {

        public static HtmlString CreateDropDown(this HtmlHelper helper, Type enumType)
        {

            SelectList list = ToSelectList(typeof(PostType));
            string  Markup =  @"<select>";
            foreach(var item in list){
                string disable =  item.Value == "1" ?  "disabled" : "";  //eavluate by yourself set it to disabled or not by user role just set a dummy condition
                Markup +=  Environment.NewLine + string.Format("<option value='{0}' {1}>{2}</option>",item.Value,disable,item.Text);
            }
            Markup += "</select>";

            return new HtmlString(Markup);
        }

        public static SelectList ToSelectList(Type enumType)
        {
            var items = new List<SelectListItem>();
            foreach (var item in Enum.GetValues(enumType))
            {
                FieldInfo fi = enumType.GetField(item.ToString());
                DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
                var title = "";
                if (attributes != null && attributes.Length > 0)
                {
                    title = attributes[0].Description;
                }
                else
                {
                    title = item.ToString();
                }

                var listItem = new SelectListItem
                {
                    Value = ((int)item).ToString(),
                    Text = title,

                };
                items.Add(listItem);
            }
            return new SelectList(items, "Value", "Text");
        }
    }
    public enum PostType
    {
        PostType1,
        PostType2,
        PostType3,
        PostType4,
        PostType5,
        PostType6
    }


}

你可以做标记..

@using MvcApplication7.Controllers;

 @Html.CreateDropDown(typeof(PostType))