简体   繁体   中英

Build Enum from Selected Enum Values ASP.NET MVC

I have an enum to keep post types :

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

I have also some user roles so based on their role, user can add post which are allowed

So I want to build dropdown list from selected enum values.

For Example : For UserType1 my enum dropdownlist will just have posttype1, for UserType4 all are allowed.

How can I achieve this in ViewModel?

Thank you in advance...

try this, create a helper

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

and then in your view

         @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"))

hope help you

you can do something like this.

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
    }


}

and you can do in markup..

@using MvcApplication7.Controllers;

 @Html.CreateDropDown(typeof(PostType))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM