2

値を適切に表現し、選択されたプロセスを処理し、後で編集フォームにチェックされた項目をチェックされたものとして表示し、他の可能な値をチェックされていないものとして表示する方法を理解しようとしています。

私はすでに何かを試していますが、正しい軌道に乗っているかどうかはわかりません。これらのソリューション編集フォームを使用すると、チェックされたアイテムのみが表示され、チェックされていない他のアイテムは表示されません。

より良い解決策がある場合は、共有してください。これらがどのように機能するかを理解しようとしているためです。

1 つまたは複数の役割に属するユーザーがいるとします。したがって、これらの 2 つのビューモデル、UserViewModel と 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;}

EditorTemplates 内には RoleViewModel.cs があります

@model Models.RoleViewModel

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

そして最後に、ビューの作成内で、これらを @model Models.UserViewModel のように表示します

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

1 に答える 1

0

方法は次のとおりです。

UserViewModel

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

FormView

アプリケーションに存在するすべてのロールをループする必要があります。次に、UserViewModel.RolesIdsSelectedにリンクされるチェックボックスを作成し、値を印刷されている現在のrole.RoleIdと比較します。一致する場合は、チェックが行われます。

@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));
    }
}

データを投稿するときは、UserViewModel.RolesIdsSelectedにユーザーがチェックしたIDがあります。次に、変更を保存します。

于 2012-08-23T21:25:04.603 に答える