Получение значений динамического флажка и метки из строго типизированного представления в MVC3 - PullRequest
0 голосов
/ 24 марта 2012

РЕДАКТИРОВАТЬ: кто бы ни исправил мой вопрос, чтобы код отображался правильно, спасибо! :)

У меня глупая проблема, с которой мне действительно нужна помощь, после целого дня поисков в Интернете я почти потерял голову!

Я работаю с членством asp.net и хочу установить роли для пользователя, когда веб-приложение будет запущено и запущено.

Чтобы реализовать это, я отправляю модель в строго типизированное представление со списком флажков, если флажок установлен для пользователя в одной из ролей в списке. (эта часть работает)

Но я не могу понять, как вернуть значения флажков в методе Edit, так как модель возвращает значение null в свойстве List.

Я уверен, что упустил что-то очевидное здесь и был бы очень рад любой помощи ...

А как я могу добавить код к этому вопросу? Я не могу правильно отформатировать ...

Посмотреть

@model Mvc4m.Models.UserRoles
@{
    ViewBag.Title = "Edit";
}

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript">    </script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>UserRoles</legend>

    <div class="editor-label">
        <h2> @Html.DisplayFor(model => model.Name)</h2>
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.Roles)
    </div>
    <div class="editor-field" id="testar">

    @foreach (var model in Model.AllRolles)
    {
        @Html.CheckBoxFor(item => model.IsActive, model.Role)
        @Html.Label(model.Role)  
    }

    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.IsApproved)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.IsApproved)
        @Html.ValidationMessageFor(model => model.IsApproved)
    </div>

    <p>
        <input type="submit" value="Save" />
    </p>
</fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Контроллер

public List<AllRolles> UserActiveRoles(string name)
{
    var list = new List<AllRolles>();

    foreach(var role in Roles.GetAllRoles())
    {
        var hej = new AllRolles()
                      {
                          Role = role,
                          IsActive = Roles.IsUserInRole(name,role)
                      };
        list.Add(hej);
    }
    return list;
}

public ActionResult Index()
{
    var roles = Roles.GetAllRoles();
    var users = from MembershipUser u in Membership.GetAllUsers()
                select new UserRoles()
                {
                    Name = u.UserName,
                    AllRolles = UserActiveRoles(u.UserName)
                };
    return View(users);
}

public ActionResult Edit(string name)
{
    var user = Membership.GetUser(name);
    var model = new UserRoles()
    {
        Name = user.UserName,
        AllRolles = UserActiveRoles(name)
    };
    return View(model);
}

//
// POST: /Admin/ManageUsers/Edit/5

[HttpPost]
public ActionResult Edit(UserRoles user)
{
    var name = user.Name;

    foreach (var role in user.AllRolles)
    {
        if (role.IsActive == true)
            Roles.AddUserToRole(name,role.Role);
        else 
            Roles.RemoveUserFromRole(name,role.Role);
    }

    return RedirectToAction("Index");
}

Модель

public class UserRoles
{
    public string Name { get; set; }

    public List<string> Roles { get; set; }

    public bool IsApproved { get; set; }

    public List<AllRolles> AllRolles { get; set; }

}

namespace Mvc4m.Areas.Admin.Models
{
    public class AllRolles
    {
        public string Role { get; set; }
        public bool IsActive { get; set; }
    }
}

Ответы [ 2 ]

0 голосов
/ 24 марта 2012

В UserRoles.cs

Изменить

public List<AllRolles> AllRolles { get; set; }

на

public AllRolles[] AllRolles { get; set; }

В Edit.cshtml

Изменить

@foreach (var model in Model.AllRolles) 
{
    @Html.CheckBoxFor(item => model.IsActive, model.Role)
    @Html.Label(model.Role)  
}

на

@for (int i = 0; i < Model.AllRolles.Length; i++) 
{
    @Html.CheckBoxFor(item => Model.AllRolles[i].IsActive)
    @Html.HiddenFor(item => Model.AllRolles[i].Role)
    @Html.Label(Model.AllRolles[i].Role)  
}

На вашем контроллере

Добавить .ToArray() после UserActiveRoles(u.UserName)

public ActionResult Index()
{
    var roles = Roles.GetAllRoles();
    var users = from MembershipUser u in Membership.GetAllUsers()
            select new UserRoles()
            {
                Name = u.UserName,
                AllRolles = UserActiveRoles(u.UserName).ToArray()
            };
    return View(users);
}

Проблема

Вы должны показать ModelBinder, что вы отправляете коллекцию вместо набора параметров.

Что отправленона сервер?

AllRolles [0] .IsActive: false

AllRolles [0] .Role: Admin

AllRolles [1] .IsActive: false

AllRolles [1]. Роль: Пользователь

Надеюсь, это поможет

0 голосов
/ 24 марта 2012

Это действительно просто. Вы должны дать своим флажкам имя, скажем, myCheckboxes, и вы передаете int [] myCheckboxes действию POST. Я предоставил вам пример кода:

На ваш взгляд, допустим, у вас есть

@foreach (var role in Model.AllRoles)
{
  <input type="checkbox" name="UserNotInRoles" value="@role.RoleId" checked/>@role.RoleName
  <br />
}

@foreach (var role in Model.UserRole)
{
  <input type="checkbox" name="UserInRoles" value="@role.RoleId" checked/>@role.RoleName    
  <br />
}

Теперь, чтобы опубликовать, что пользователь установил / снял галочку, вы используете следующее:

[HttpPost]
public ActionResult Edit(UserRoleSaveVM saveRoles)
{ 

  if (saveRoles.UserNotInRoles != null)
  {                
     foreach (int roleID in saveRoles.UserNotInRoles)
     {
        //DO SOMETHING

     }
  }

, где UserRoleSaveVM равен

public class UserRoleSaveVM
{
  public int UserID { get; set; }
  public int[] UserInRoles { get; set; } //note that property name is the same as checkbox name
  public int[] UserNotInRoles{ get; set; } //note that property name is the same as checkbox name
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...