2

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

2
  • create a List of SelectListItems and populate it with the desired values based on the user roles. Commented Nov 6, 2014 at 16:07
  • But then it will not be strongyly typed for that enum. Commented Nov 6, 2014 at 16:12

2 Answers 2

1

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

Sign up to request clarification or add additional context in comments.

Comments

0

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

2 Comments

I think by selected types there is a misunderstanding: I mean I want to create some dropdownlist from enum but disable some values based on roles.
just modified the answer..take a look there..you can enhance it according to your demand if you find useful..

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.