c# - 설정 - vb 폼 로드




MVC htmlAttribute에서 비활성화를 설정하는 방법 (6)

HTML 도우미를 사용할 때 조건을 기반으로 특성을 설정하는 가장 좋은 방법은 무엇입니까? 예를 들어

<%if (Page.User.IsInRole("administrator")) {%>
<%=Html.TextBoxFor(m => m.FirstName, new {@class='contactDetails'}%>
<%} else {%>
<%=Html.TextBoxFor(m => m.FirstName, new {@class='contactDetails', disabled = true}%>
<%}%>

프로그래밍 방식으로 추가 KeyPair를 익명 형식에 추가하는 더 좋은 방법이 있어야합니까? 사용할 수 없습니다.

new { .... disabled = Page.User.IsInRole("administrator") ... }

브라우저는 비활성화 된 속성 값을 입력을 비활성화하는 것으로 간주하므로


@SLaks 제안을 사용하여 Extension 메서드를 사용하고 Jeremiah Clark의 Extension 메서드 예제 를 사용하여 확장 메서드를 작성했습니다. 이제 할 수 있습니다.

Html.TextBoxFor(m => m.FirstName,new{class='contactDetails', ...},Page.User.IsInRole("administrator"));

비록 더 나은 방법이 있더라도 확실하지 않습니다.

public static class InputExtensions
{

    public static IDictionary<string, object> TurnObjectIntoDictionary(object data)
    {
        var attr = BindingFlags.Public | BindingFlags.Instance;
        var dict = new Dictionary<string, object>();
        if (data == null)
            return dict;
        foreach (var property in data.GetType().GetProperties(attr))
        {
            if (property.CanRead)
            {
                dict.Add(property.Name, property.GetValue(data, null));
            }
        }
        return dict;

    }

    public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool disabled)
    {
        IDictionary<string, object> values =  TurnObjectIntoDictionary(htmlAttributes);

        if (disabled)
            values.Add("disabled","true");


        return htmlHelper.TextBoxFor(expression, values);
    }

    public static MvcHtmlString TextAreaFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool disabled)
    {
        IDictionary<string, object> values = TurnObjectIntoDictionary(htmlAttributes);

        if (disabled)
            values.Add("disabled", "true");


        return htmlHelper.TextAreaFor(expression, values);
    }

    public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool>> expression, object htmlAttributes, bool disabled)
    {
        IDictionary<string, object> values = TurnObjectIntoDictionary(htmlAttributes);

        if (disabled)
            values.Add("disabled", "true");


        return htmlHelper.CheckBoxFor(expression, values);
    }
}

Page.User.IsInRole ( "administrator")? null : 새로운 {disabled = "disabled"}


null 인 모든 속성을 제외하고 입력 객체의 사본을 생성하고 MVC에서 쉽게 사용할 수 있도록 모든 것을 사전으로 반환하는 Object의 확장 메소드를 생성했습니다. HtmlHelpers :

public static Dictionary<string, object> StripAnonymousNulls(this object attributes)
{
   var ret = new Dictionary<string, object>();
   foreach (var prop in attributes.GetType().GetProperties())
   {
      var val = prop.GetValue(attributes, null);
      if (val != null)
         ret.Add(prop.Name, val);
   }
   return ret;
}

속성을 두 번 반영하여 성능에 미치는 영향에 대해 확신하지 못하고 확장 메서드의 이름을 많이 좋아하지 않지만 잘 수행 한 것 같습니다.

new {
       @class = "contactDetails",
       disabled = Page.User.IsInRole("administrator") ? "true" : null
    }.StripAnonymousNulls()

그것은 저를 위해 또한 작동합니다 ...

<%: Html.DropDownList("SportID", (SelectList)ViewData["SportsSelectList"], "-- Select --", new { @disabled = "disabled", @readonly = "readonly" })%>

<%= Html.CheckBoxFor(model => model.IsActive, new { @disabled = "disabled", @readonly = "readonly" })%>

새로운 TextBox 메서드로 자신의 HtmlHelper Extension 클래스를 작성하는 것이 좋습니다.

public static class HtmlHelperExtensions
{
    public static MvcHtmlString TextBoxFor(this HtmlHelper htmlHelper, Expression<Func<TModel, TProperty>> expression, string cssClass, bool disabled)
    {
        return disabled 
            ? Html.TextBoxFor(expression, new {@class=cssClass, disabled="disabled"})
            : Html.TextBoxFor(expression, new {@class=cssClass})
    }
}

지금 (이 새 클래스가 같은 네임 스페이스에 있거나 페이지 머리글이나 web.config의 페이지 섹션에 새 네임 스페이스를 가져온 경우) aspx 페이지에서이 작업을 수행 할 수 있습니다.

<%=Html.TextBoxFor(m => m.FirstName, "contactDetails", Page.User.IsInRole("administrator")) %>

Dictionary<string, object> 를 전달하고 if 문 내에 disabled 키를 추가 if 합니다.

bool disabled 매개 변수를 취하는 확장 메서드의 오버로드를 작성 RouteValueDictionary 매개 변수가 true 경우 특성 매개 변수에서 생성 된 RouteValueDictionary 추가하는 것이 좋습니다. ( RouteValueDictionaryfalse 경우 다른 항목을 disabled 않고 disabled 항목을 제거 할 수도 있습니다)





asp.net-mvc