Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Заполнение свойства модели типа enum / 4 сообщений из 4, страница 1 из 1
12.05.2015, 18:32
    #38956808
delphi_begin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение свойства модели типа enum
Всем привет!
Есть модель со свойстов Role
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
puclic class Test{
      public Role Role { get; set; }
    }

    public enum Role { User,Admin}

При заполнении из представления, я хочу выбирать присваивать значение через выпадающий список, поэтому сделал для данного поля шаблон: RoleTemplate.cshtml

@using MvcApplication32.Models
@model Role

<select id="Role" name="Role">

  

    @foreach (Role item in Enum.GetValues(typeof(Role)))
    {
        <option value="@item" >@item</option>
    }
</select>

В разметке представления я пишу[SRC C#]


@model MvcApplication32.Models.Test

@using (Html.BeginForm()) {

@Html.EditorFor(m=>m.Role,"RoleTemplate")

}

И получаю ошибку:
The modelitem passed into Dictionary is null, but this dictionary requires a none-null model item of type
Текст ошибки я понял, но как мне иметь не null поле, если я только добавляю туда значение??
[/SRC]
...
Рейтинг: 0 / 0
12.05.2015, 19:12
    #38956828
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение свойства модели типа enum
delphi_begin,
Посмотрите тут есть ответ.
...
Рейтинг: 0 / 0
13.05.2015, 09:36
    #38957058
delphi_begin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение свойства модели типа enum
Axeleron,

Спасибо за совет. Но, несколько сложно для моего уровня и выглядит, как костыли.
Сделал таким образом:

В контроллере добавил свойство во ViewBag:
Код: c#
1.
   ViewBag.Role = new SelectList(Enum.GetValues(typeof(Role)));



А в представлении:

Код: plaintext
1.
2.
 @Html.DropDownList("Role", String.Empty)
  @Html.ValidationMessageFor(model => model.Role)
...
Рейтинг: 0 / 0
13.05.2015, 11:38
    #38957197
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение свойства модели типа enum
Делал по статье из инета под себя обработку флагового энума, чтоб можно было галочками формировать значение

Хэлпер формирования элемента управления

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
public static class HtmlHelpers
    {
        public static MvcHtmlString CheckBoxListForEnum<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression,Func<TValue,string> namer, object htmlAttributes = null, bool sortAlphabetically = true)
        {
            
            var fieldName = ExpressionHelper.GetExpressionText(expression);
            var fullBindingName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName);
            var fieldId = TagBuilder.CreateSanitizedId(fullBindingName);
            var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
            string propertyName = metadata.PropertyName;
            var value = metadata.Model;

            // Get all enum values
            IEnumerable<TValue> values = Enum.GetValues(typeof(TValue)).Cast<TValue>();

            // Sort them alphabetically by enum name
            if (sortAlphabetically)
                values = values.OrderBy(i => i.ToString());

            TagBuilder table = new TagBuilder("table");
            TagBuilder tbody = new TagBuilder("tbody");
            var rowBuilder = new StringBuilder();
            foreach (var item in values)
            {
                TagBuilder row = new TagBuilder("tr");
                TagBuilder td1 = new TagBuilder("td");
                TagBuilder builder = new TagBuilder("input");
                long targetValue = Convert.ToInt64(item);
                long flagValue = Convert.ToInt64(value);

                if ((targetValue & flagValue) == targetValue)
                    builder.MergeAttribute("checked", "checked");

                builder.MergeAttribute("type", "checkbox");
                builder.MergeAttribute("value", item.ToString());
                builder.MergeAttribute("name", fieldId);
                td1.InnerHtml = builder.ToString(TagRenderMode.Normal);
                TagBuilder td2 = new TagBuilder("td");
                td2.InnerHtml = namer(item);
                row.InnerHtml = td1.ToString(TagRenderMode.Normal) + td2.ToString(TagRenderMode.Normal);

                rowBuilder.Append(row.ToString(TagRenderMode.Normal));
            }
            tbody.InnerHtml = rowBuilder.ToString();
            table.InnerHtml = tbody.ToString(TagRenderMode.Normal);

            return new MvcHtmlString(table.ToString(TagRenderMode.Normal));
        }
    }



Класс биндера

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
public class OperationFlagsModelBinder : DefaultModelBinder
    {
        /// <summary>
        /// Fix for the default model binder's failure to decode flag enum types from chexbox list.
        /// </summary>
        protected override object GetPropertyValue( ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder )
        {
            var propertyType = propertyDescriptor.PropertyType;

            // Check if the property type is an enum with the flag attribute
            if ( propertyType.IsEnum && propertyType.GetCustomAttributes<FlagsAttribute>().Any() )
            {
                var providerValue = bindingContext.ValueProvider.GetValue( bindingContext.ModelName );
                if ( providerValue != null )
                {
                    var value = providerValue.RawValue;
                    if ( value != null )
                    {
                        // In case it is a checkbox list/dropdownlist/radio button list
                        if ( value is string[] )
                        {
                            // Create flag value from posted values
                            var flagValue = ( ( string[] )value ).Aggregate( 0, ( current, v ) => current | ( int )Enum.Parse( propertyType, v ) );

                            return Enum.ToObject( propertyType, flagValue );
                        }
                        // In case it is a single value
                        if ( value.GetType().IsEnum )
                        {
                            return Enum.ToObject( propertyType, value );
                        }
                    }
                }
            }
            return base.GetPropertyValue( controllerContext, bindingContext, propertyDescriptor, propertyBinder );
        }
    }




Создание биндера

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 protected void Application_Start()
        {
            //Database.SetInitializer<ApplicationDbContext>(new AppDbInitializer());
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            ControllerBuilder.Current.SetControllerFactory(
                new NinjectControllerFactory());
            ModelBinders.Binders.DefaultBinder = new Infrastructure.OperationFlagsModelBinder();
        }





Вызов во вьюхе
Код: c#
1.
@Html.CheckBoxListForEnum(x => x.StatusFlags, MyMethodToRepresentEnumAsString, true)
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Заполнение свойства модели типа enum / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]