4

ASP.NET MVC に CheckBoxList がないことを回避しようとしています。Enum値のリストを問題なくレンダリングできるようになりましたが、モデルに基づいてchecked属性を設定する方法に行き詰まっています-この場合、ロールエンティティのIListを持つユーザーエンティティです. ロール ID は列挙値に対応します。

この例では、Spark ビュー エンジンの構文を使用していますが、機能的には標準の ASP.NET MVC ビュー エンジンと同じです ("$(" は "<%=" または "<%" と同じです)。

<for each="var r in Enum.GetValues(typeof(UserRole))">
    <label><input type="checkbox" name="Roles" value="${(int)r}" checked="[How-The-Heck-To-I-Get-This?]" />${r}</label>
</for>
4

4 に答える 4

9

ロールがこのように定義されている場合、複数のロールをユーザーに関連付けることができます

[Flags]
public enum UserRole
{        
    DataReader = 1,
    ProjectManager = 2,
    Admin = 4,
}

簡単な拡張メソッドを追加することで、ロールにターゲットロールが含まれているかどうかを確認できます

public static class RoleExtension
{
    public static bool HasRole(this UserRole targetVal, UserRole checkVal)
    {
        return ((targetVal & checkVal) == checkVal);
    }
}

ビューで拡張メソッドを使用してチェック ボックスを更新します。次の方法がビュー エンジンに適しているかどうかはわかりません。

<for each="var r in Enum.GetValues(typeof(UserRole))">
<label>
    <input 
       type="checkbox"
       name="Roles" 
       value="${(int)r}" 
       checked="${Model.Role.HasRole(r) ? "checked" : string.Empty}" />
</label>

于 2009-09-23T21:28:38.627 に答える
3
<for each="var r in Enum.GetValues(typeof(UserRole))">
    <label>
      <% if (r.Checked) { %>
        <input type="checkbox" checked="checked" />${r}
      <% } else { %>
        <input type="checkbox" />${r}
      <% } %>
    </label>
</for>

PS追加された構文は標準のビューエンジン用であり、コンパイルできない可能性がありますが、アイデアは明確です。

于 2009-09-23T21:14:31.650 に答える
2

モデル ロールとの等価性をチェックし、等しい場合は "checked" に設定し、そうでない場合は string.Empty に設定します。

<label>
    <input type="checkbox"
           name="Roles"
           value="${(int)r}"
           ${ Model.Role == r ? "checked='checked'" : string.Empty } />
    ${r}
</label>
于 2009-09-23T21:18:25.950 に答える
1

ねえ、私は実際に上記の方法を機能させることができませんでした。「checked」属性の値を空の文字列に設定すると、IE でチェックされたチェックボックスが引き続き表示されます。私の解決策は、HtmlHelper 拡張機能を追加することでした。

public static string SimpleCheckbox(this HtmlHelper helper, 
                                    string name, 
                                    string value, 
                                    bool isChecked)
{
    return String.Format("<input type=\"checkbox\" name=\"{0}\" value=\"{1}\" " + (isChecked ? "checked" : "") + "/>", name, value);
}

そしてマークアップで:

<%= Html.SimpleCheckbox("checkboxId", item.Id, item.IsSelected) %>
于 2009-11-10T21:10:50.220 に答える