2016-06-23 4 views
2

Простите мое невежество. Не сделано много работы MVC, и я уверен, что должен быть лучший способ сделать это, но я не могу найти его. У меня есть флаги ENUM, как это:Как уменьшить дублирование кода в представлении ASP.NET MVC при работе с флагом enum

[Flags] 
public enum Services 
{ 
    Foo = 1, 
    Bar = 2, 
    Meh = 4 
} 

и свойство SelectedServices на моей модели, которая имеет значение этого типа. В представлении у меня есть флажок для каждой возможной службы. Я реализовал логику привязки следующим образом:

<div><label><input type="checkbox" name="services" value="@((int)Services.Foo)" 
@if(Model.SelectedServices.HasFlag(Services.Foo)) 
{ 
    <text>checked</text> 
} 
/>Foo</label></div> 

<div><label><input type="checkbox" name="services" value="@((int)Services.Bar)" 
@if(Model.SelectedServices.HasFlag(Services.Bar)) 
{ 
    <text>checked</text> 
} 
/>Bar</label></div> 

И так далее. Это работает, но на самом деле ужасно грязно.

Должен быть, конечно, лучший способ инкапсулировать это, но я понятия не имею, какова соответствующая концепция в MVC?

+0

поиск Google дал меня [это] (http: // stackov erflow.com/questions/388483/how-do-you-create-a-dropdownlist-from-an-enum-in-asp-net-mvc); не уверен, что это именно то, что вам нужно, но должно дать вам представление о том, что вам нужно сделать. –

+0

Создайте модель представления с помощью 'bool IsFoo' и' bool IsBar' и 'bool IsMeh', тогда вы можете использовать строго типизированный' Html .CheckBoxFor() 'для генерации флажков –

ответ

2

Создание бритвы помощника:

@helper DisplayFlagHelper(Services flag) 
{ 
    <div><label><input type="checkbox" name="services" value="@((int)flag)" 
    if(Model.SelectedServices.HasFlag(flag)) 
    { 
     <text>checked</text> 
    } 
    />@flag</label></div> 
} 

@DisplayFlagHelper (Services.Foo)

или общий вид

+0

Или используйте @ Html.CheckBoxFor с моделью просмотра yes. – borgez

4

Вы текущий код не будет связываться с вашим enum когда вы отправите форму, так как это будет только принимается как массив значений. Как всегда, используйте модель представления для представления того, что вы хотите отображать/редактировать в представлении.

public class MyViewModel 
{ 
    [Display(Name = "Foo")] 
    public bool IsFoo { get; set; } 
    [Display(Name = "Bar")] 
    public bool IsBar { get; set; } 
    [Display(Name = "Meh")] 
    public bool IsMeh { get; set; } 
    .... // other properties of your view model 
} 

и отобразить значение enum к модели представления

model.IsFoo= yourEnumProperty.HasFlag(Type.Foo); // etc 

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

@model MyViewModel 
.... 
@Html.CheckBoxFor(m => m.IsFoo) 
@Html.LabelFor(m => m.IsFoo) 
@Html.CheckBoxFor(m => m.IsBar) 
@Html.LabelFor(m => m.IsBar) 
.... 

и, наконец, в методе POST

[HttpPost] 
public ActionResult Edit(MyViewModel model) 
{ 
    bool isTypeValid = model.IsFoo || model.IsBar || model.IsMeh; 
    if (!isTypeValid) 
    { 
     // add a ModelState error and return the view 
    } 
    Services myEnumValue = model.IsFoo ? Services.Foo : 0; 
    myEnumValue |= model.IsBar ? Services.Bar : 0; 
    myEnumValue |= model.IsMeh ? Services.Meh : 0; 
    // map the view model to an instance of the data model, save and redirect