2016-02-01 4 views
3

Это мой код контроллера.Невозможно заполнить флажок из данных базы данных в mvc 4

public ActionResult Create() 
{ 
    ViewBag.grp_id = new SelectList(db.tm_grp_group, "grp_id", "grp_name"); 
    ViewBag.perm_id = new SelectList(db.tm_perm_level, "perm_id", "perm_levelname"); 
    return View(); 
} 

Ниже мой код просмотра.

@model Permission.ts_grp_perm_mapping 
.... 
@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>ts_grp_perm_mapping</legend> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.grp_permid) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.grp_permid) 
      @Html.ValidationMessageFor(model => model.grp_permid) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.grp_id, "tm_grp_group") 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("grp_id", String.Empty) 
      @Html.ValidationMessageFor(model => model.grp_id) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.perm_id, "tm_perm_level") 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("perm_id", String.Empty) 
      @Html.ValidationMessageFor(model => model.perm_id) 
     </div> 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

В контроллере ViewBag.perm_id содержит некоторые значения (это внешний ключ). In perm.id отображает в виде dropdownbox, но я хочу, чтобы это было в виде checkboxlist. Как я могу это достичь?

Это модель, которую я создал.

public class AssignUserViewModel 
{ 
    public tm_perm_level[] perms { get; set; } 
    public int grp_id { get; set; } 
} 

Теперь в контроллере, как я могу отправлять значения для просмотра? Это моя tm_perm_level модель

public partial class tm_perm_level 
{ 
    public tm_perm_level() 
    { 
     this.ts_grp_perm_mapping = new HashSet<ts_grp_perm_mapping>(); 
    } 
    public int perm_id { get; set; } 
    public string perm_levelname { get; set; } 
    public string perm_description { get; set; } 
    public bool perm_status { get; set; } 
    public virtual ICollection<ts_grp_perm_mapping> ts_grp_perm_mapping { get; set; } 
} 

Это ts_grp_perm_mapping модель

public partial class ts_grp_perm_mapping 
{ 
    public ts_grp_perm_mapping() 
    { 
     this.ts_perm_levelmapping = new HashSet<ts_perm_levelmapping>(); 
    } 
    public int grp_permid { get; set; } 
    public int grp_id { get; set; } 
    public int perm_id { get; set; } 
    public List<tm_perm_level> permissions { get; set; } 

    public virtual tm_grp_group tm_grp_group { get; set; } 
    public virtual tm_perm_level tm_perm_level { get; set; } 
    public virtual ICollection<ts_perm_levelmapping> ts_perm_levelmapping { get; set; } 
} 
+0

Создайте модель представления, содержащую 'bool IsSelectedProperty' и другие свойства' tm_perm_level', которые вы хотите в представлении. Затем используйте цикл 'for'' EditorTemplate' для отображения каждого элемента в коллекции –

+0

Как я могу отправлять значения из контроллера для просмотра? –

+0

Модель просмотра, которую вы показали, не будет работать. Вы хотите отобразить каждый доступный «tm_perm_level» в представлении с соответствующим флажком? И вам нужно показать свои модели. –

ответ

1

Особенно при редактировании, всегда начинается с просмотра моделей, чтобы представить то, что вы хотите отобразить (см What is ViewModel in MVC?)

public class PermissionVM 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public bool IsSelected { get; set; } 
} 
public class GroupPermissionVM 
{ 
    public int GroupID { get; set; } 
    public IEnumerable<SelectListItem> GroupList { get; set; } 
    public IEnumerable<PermissionVM> Permissions { get; set; } 
} 

Затем создайте EditorTemplate для PermissionVM. В /Views/Shared/EditorTemplates/PermissionVM.cshtml папке

@model PermissionVM 
<div> 
    @Html.HiddenFor(m => m.ID) 
    @Html.HiddenFor(m => m.Name) 
    @Html.CheckBoxFor(m => m.IsSelected) 
    @Html.LabelFor(m => m.IsSelected, Model.Name) 
</div> 

и основной вид будет

@model GroupPermissionVM 
.... 
@using (Html.BeginForm()) 
{ 
    // dropdownlist 
    @Html.LabelFor(m => m.GroupID) 
    @Html.DropDownListFor(m => m.GroupID, Model.GroupList, "Please select") 
    @Html.ValidationMessageFor(m => m.GroupID) 
    // checkboxlist 
    @Html.EditorFor(m => m.Permissions) 

    <input type="submit" value="Create" /> 
} 

Методы контроллера затем будет

public ActionResult Create() 
{ 
    var groups = db.tm_grp_group; 
    var permissions = db.tm_perm_level; 

    GroupPermissionVM model = new GroupPermissionVM 
    { 
     GroupList = new SelectList(groups, "grp_id", "grp_name"), 
     Permissions = permissions.Select(p => new PermissionVM 
     { 
      ID = p.perm_id, 
      Name = p.perm_levelname 
     } 
    }; 
    return View(model); 
} 

[HttpPost] 
public ActionResult Create(GroupPermissionVM model) 
{ 
    if (!ModelState.IsValid) 
    { 
     var groups = db.tm_grp_group; 
     model.GroupList = new SelectList(groups, "grp_id", "grp_name"); 
     return View(model); 
    } 
    // map the view model to a new instance of your data model(s) 
    // note: to get the ID's of the selected permissions - 
    // var selectedPermissions = model.Permissions.Where(p => p.IsSelected).Select(p => p.ID); 
    // save and redirect 
} 

Side Примечание: Я настоятельно рекомендую вам следовать обычным соглашениям об именах

Редактировать

Основываясь на комментарий OP для опции с помощью радио-кнопки, чтобы выбрать только один пункт, пересмотренный код будет

public class PermissionVM 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 
public class GroupPermissionVM 
{ 
    public int GroupID { get; set; } 
    public int PermissionID { get; set; } 
    public IEnumerable<SelectListItem> GroupList { get; set; } 
    public IEnumerable<PermissionVM> Permissions { get; set; } 
} 

и вид будет (не требуется отдельный EditorTemplate)

@model GroupPermissionVM 
.... 
@using (Html.BeginForm()) 
{ 
    // dropdownlist as above 

    // radio buttons 
    foreach (var permission in Model.Permissions) 
    { 
     <label> 
      @Html.RadioButtonForm(m => m.PermissionID, permission.ID) 
      <span>@permission.Name</span> 
     </label> 
    } 
    <input type="submit" value="Create" /> 
} 

и в методе POST значение model.PermissionID будет содержать ID выбранного Разрешения.

+0

Большое спасибо. Я буду реализовывать сейчас. –

+0

Я могу заполнить флажки, но есть некоторые проблемы с этим предложением GroupList = new SelectList (группы, «grp_id», «grp_name»), и сообщение об ошибке не может неявно преобразовывать тип system.web.mvc.selectlistitem в систему. collections.generic.IEnumerable Явное преобразование существует (вам не хватает роли)? –

+0

Можете ли вы рассказать мне эту строку? Я имею в виду логику @ Html.LabelFor (m => m.IsSelected, Model.Name) –

Смежные вопросы