2 votes

valeurs des cases à cocher dans mvc

J'essaie de comprendre comment représenter correctement les valeurs, le processus sélectionné et, plus tard, le formulaire d'édition affichant les éléments cochés comme cochés et les autres valeurs possibles comme non cochées.

J'ai déjà essayé quelque chose mais je ne suis pas sûr d'être sur la bonne voie. En utilisant ces solutions, le formulaire d'édition n'affiche que les éléments cochés, et pas les autres non cochés.

Si vous avez une meilleure solution, n'hésitez pas à la partager, car j'essaie de comprendre comment cela fonctionne.

Le voici : Supposons qu'il existe un utilisateur qui peut appartenir à un ou plusieurs rôles. Je représenterais donc ces éléments par deux modèles de vue, UserViewModel et RoleViewModel.

**UserViewModel.cs**

public int id {get; set;}
public string username {get; set;}

public UserViewModel()
{
   Roles = new List<RoleViewModel>();
}

public void SendToDomain(User user, ISession nhibSession)
{
   if(user.Roles != null)
   {
      user.Roles.Clear();//Clear previous selected items
      foreach(Role role in Roles)
      {
        if(role.IsInRole)
          user.Role.Add(nhibSession.Load<Role>(user.RoleId)); 
      }
   }
}

**RoleViewModel**
public bool IsInRole {get; set;}

[HiddenInput(displayValue = false)]
public int RoleId {get; set;}

[HiddenInput(displayValue = true)]
public string RoleName {get; set;}

Et dans EditorTemplates, j'ai RoleViewModel.cs

@model Models.RoleViewModel

@Html.CheckBoxFor(m=>m.IsInRole)
@Html.HiddenFor(m=>m.RoleId)
@Html.LabelFor(m=>m.IsInRole, Model.RoleName)

Enfin, à l'intérieur de la vue Create, je les affiche comme suit @model Models.UserViewModel

<div> User roles </div> <div> @Html.EditorFor(m => m.Roles) </div>

0voto

Alexandre Jobin Points 1209

Voici comment procéder :

Modèle de vue d'utilisateur

public int id {get; set;}
public string username {get; set;}
public int[] RoleIdsSelected { get; set; } 

FormView

Vous devez faire une boucle sur Tous les rôles qui existe dans votre application. Ensuite, créez une case à cocher qui sera liée à votre UserViewModel.RolesIdsSelected et comparez les valeurs au role.RoleId actuel qui est imprimé. S'il y a une correspondance, il y aura une vérification.

@model UserViewModel

@{
    foreach (var role in (IEnumerable<Role>)ViewBag.AllRoles)
    {
        <label>
            @Html.CheckBoxFor(x => x.RoleIdsSelected, role.RoleId)
            @role.RoleName
        </label>
    }
}

CheckboxExtensions

public static class InputExtensions
{
    public static MvcHtmlString CheckBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object value)
    {
        return htmlHelper.CheckBoxFor<TModel, TProperty>(expression, value, null);
    }

    public static MvcHtmlString CheckBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object value, object htmlAttributes)
    {
        return htmlHelper.CheckBoxFor<TModel, TProperty>(expression, value, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
    }

    public static MvcHtmlString CheckBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object value, IDictionary<string, object> htmlAttributes)
    {
        ModelMetadata modelMetadata = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData);
        return CheckBoxHelper<TModel, TProperty>(htmlHelper, modelMetadata, modelMetadata.Model, ExpressionHelper.GetExpressionText(expression), value, htmlAttributes);
    }

    private static MvcHtmlString CheckBoxHelper<TModel, TProperty>(HtmlHelper htmlHelper, ModelMetadata metadata, object model, string name, object value, IDictionary<string, object> htmlAttributes)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }

        RouteValueDictionary routeValueDictionary = htmlAttributes != null ? new RouteValueDictionary(htmlAttributes) : new RouteValueDictionary();

        string fullHtmlFieldName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);

        if (string.IsNullOrEmpty(fullHtmlFieldName))
        {
            throw new ArgumentException("Le nom du control doit être fourni", "name");
        }

        TagBuilder tagBuilder = new TagBuilder("input");

        tagBuilder.MergeAttributes<string, object>(htmlAttributes);
        tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.CheckBox));
        tagBuilder.MergeAttribute("name", fullHtmlFieldName, true);

        string text = Convert.ToString(value, CultureInfo.CurrentCulture);

        tagBuilder.MergeAttribute("value", text);

        if (metadata.Model != null)
        {
            foreach (var item in metadata.Model as System.Collections.IEnumerable)
            {
                if (Convert.ToString(item, CultureInfo.CurrentCulture).Equals(text))
                {
                    tagBuilder.Attributes.Add("checked", "checked");
                    break;
                }
            }
        }

        return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.SelfClosing));
    }
}

Lorsque vous afficherez vos données, vous aurez dans le UserViewModel.RolesIdsSelected les identifiants qui ont été cochés par l'utilisateur. Ensuite, enregistrez la modification !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X