2014-11-06 39 views
1

我有一个枚举保持文章类型:构建枚举选自枚举值ASP.NET MVC

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

我也有一些用户角色,以便根据自己的角色,用户可以添加后其被允许

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

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

我该如何在ViewModel中实现这一点?

在此先感谢...

+0

创建SelectListItem列表并根据用户角色填充所需的值。 – user1666620 2014-11-06 16:07:19

+0

但是,它不会强烈地键入该枚举。 – gandil 2014-11-06 16:12:23

回答

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

我认为通过选定的类型有一个误解:我的意思是我想创建一些从枚举dropdownlist,但禁用一些基于角色的值。 – gandil 2014-11-06 16:15:30

+0

只是修改答案..看看那里..你可以根据你的需求增强它,如果你觉得有用.. – 2014-11-06 16:45:45

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

希望帮助您