2014-12-09 5 views
0

중첩 된 사전을 EditorFor viewData에 전달하려고합니다.EditorForHtml의 htmlAttributes에 중첩 된 사전을 사용하는 ASP MVC 5.2

@{ 
    var viewData = new RouteValueDictionary(); 
    var htmlAttributes = new RouteValueDictionary(); 
    htmlAttributes.Add("title", "foo"); 
    viewData["htmlAttributes"] = htmlAttributes; 
} 
Html.EditorFor(model => model.SomeProperty, viewData); 

문제는 tile = "foo"가 렌더링되지 않는다는 것입니다. 사용할 때

var htmlAttributes = new {title = "foo"}; 

모든 것이 예상대로 작동합니다.

내 응용 프로그램에서 동적으로 생성되기 때문에 htmlAttributes가 사전이어야합니다.

어떻게 사전을 전달할 수 있습니까? 이미 expandoObject로 thmlAttributes를 전달하려고 시도했으나 작동하지 않습니다.

답변

0

EditorFor가 많은 html 요소를 생성하므로 쉽게 htmlAttributes를 적용해야하는 요소가 명확하지 않습니다.

그러나 어려운 방법은 Views/Shared/EditorTemplates/Object.cshtml에서 고유 한 Object.cshtml을 구현하는 것입니다. 다음은 ViewData에서 값을 가져와 원하는대로 출력 HTML을 구성 할 수있는 사용자 정의 Object.cshtml (부트 스트랩 관련)의 예입니다. 그것은하실 수 없습니다

@using MvcApplication1.Utility 
@if (ViewData.TemplateInfo.TemplateDepth > 1) { 
    @ViewData.ModelMetadata.SimpleDisplayText 
} else { 
    foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm))) { 
     var htmlString = prop.IsReadOnly ? Html.Display(prop.PropertyName) : Html.Editor(prop.PropertyName); 
     if (prop.HideSurroundingHtml) { 
      @htmlString 
     } 
     else 
     { 
      var errors = Html.ValidationErrors(prop); 
      <div class="form-group @(prop.IsReadOnly ? "form-group-readonly" : "") @(errors.Any() ? "has-error has-feedback" : "")"> 
       <label class="control-label" for="@ViewData.TemplateInfo.GetFullHtmlFieldId(prop.PropertyName)">@prop.GetDisplayName()</label> 
       @htmlString 
       @foreach (var err in errors) 
       { 
        <div class="field-validation-error">@err.ErrorMessage</div> 
       } 
      </div> 
     } 
    } 
} 

및 유틸리티 기능

public static IEnumerable<ModelError> ValidationErrors<TModel>(this HtmlHelper<TModel> htmlHelper, ModelMetadata modelMetadata) 
    { 
     string modelName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(modelMetadata.PropertyName); 
     return ValidationErrors(htmlHelper, modelName); 
    } 

    public static IEnumerable<ModelError> ValidationErrors<TModel>(this HtmlHelper<TModel> htmlHelper) 
    { 
     return ValidationErrors(htmlHelper, String.Empty); 
    } 

    private static IEnumerable<ModelError> ValidationErrors(this HtmlHelper htmlHelper, String modelName) 
    { 
     FormContext formContext = htmlHelper.ViewContext.FormContext; 
     if (formContext == null) 
      yield break; 

     if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName)) 
      yield break; 

     ModelState modelState = htmlHelper.ViewData.ModelState[modelName]; 
     if (modelState == null) 
      yield break; 

     ModelErrorCollection modelErrors = modelState.Errors; 
     if (modelErrors == null) 
      yield break; 

     foreach(var err in modelErrors) 
      yield return err; 
    } 
+0

이 경우를 나는 단순한 문자열 속성을 사용하고있는 Textbox로 렌더링해야합니다. MVC 5.1 이후로 htmlAttributes 속성을 html 속성으로 렌더링되는 additionalViewData 매개 변수에 추가 할 수 있습니다. 그래서 이것이 문제가되어서는 안됩니다. – wertzui

+0

그 경우 –

+0

대신 Html.TextBoxFor를 사용하십시오. 그러나 EditorFor에서 사용하고 싶습니다. 그런 식으로 2 개의 TextBoxes를 포함 할 수있는 자체 템플릿을 사용할 수도 있기 때문입니다. EditorFor를 사용하면 해당 "htmlAttributes"가 ViewData에 기록되고 해당 사용자 정의 템플리트의 모든 텍스트 상자가 자동으로 선택됩니다. – wertzui