2011-12-21 6 views
2

RenderPartial을 사용하여 EditorTemplate을 렌더링하는 데 사용할 수있는 방법이 있습니까?RenderPartial과 함께 EditorTemplate 사용

JQuery UI 자동 완성 기능을 사용하여 사용자가 회사 목록에서 선택할 수있게 해주는 EditorTemplate에 많은 작업을 넣었습니다. (HTML 헬퍼를 사용하여 올바른 JS 라이브러리와 CSS 규칙이 생성 된 웹 페이지의 "올바른"위치에 포함되도록합니다.)

동일한 응용 프로그램에 대해 다른 페이지를 만드는 동안 템플릿을 다시 작성하면 EditorTemplate을 구축 한 모델 외부에서 다시 사용할 수 있습니다.

이 코드는 작업을 수행하지만 어떤면에서는 해킹 만 고려할 수 있습니다.

@using(Html.BeginForm()) { 
    ViewData.TemplateInfo.HtmlFieldPrefix = "CompanyName"; 
    Html.RenderPartial("~/Views/Shared/EditorTemplates/Company.cshtml", string.Empty); 
    <input type="submit" value='Filter' /> 
} 

내가 EditorFor를 사용하지 않는 때문에, 아니 "이름"매개 변수가 없기 때문에 렌더링 된 입력 필드는 "회사 명"의 HtmlFieldPrefix입니다. 자동 완성 기능이 작동하며 양식을 제출하고 데이터를 필터링 할 수 있습니다. 그러나이 해결책은 지저분하고 허약합니다. 누구나 더 좋은 생각이 있습니까?

답변

0

나는 app_code의 도우미와 같은 재사용 가능한 "컨트롤"을 옮기고 편집기 템플릿을 작은 래퍼로 만들어 도우미를 호출합니다.

날짜 시간에 대한 나의 editorTemplate은 다음과 같습니다

@model DateTime? 
@using System.Globalization 
@{ 
    var name = MvcHtmlString.Create(ViewData.TemplateInfo.GetFullHtmlFieldName("")); 
    var id = MvcHtmlString.Create(ViewData.TemplateInfo.GetFullHtmlFieldId("")); 
    var value = Model.HasValue && Model.Value > DateTime.MinValue ? string.Format("{0:d}", Model) : ""; 
} 
<span class="edit"> 
    @Editor.DateTime(id, name, value) 
</span> 

내가 포함 된이와의 App_Code에서 Editor.cshtml :

@helper DateTime(IHtmlString id, IHtmlString name, string value) { 
    <input type="text" class="editor-date" id="@id" name="@name" value="@value" /> 
    if (HttpContext.Current.Items["editor-date"] == null) { 
     HttpContext.Current.Items["editor-date"] = new object(); 

    <script type="text/javascript"> 
     $(function() { 
      $(".editor-date").datepicker({ dateFormat: 'd/m/yy' }); 
     }); 
    </script> 
    } 
} 

그래서 내가 EditorFor에서 내 데이트 편집기를 사용하거나 다른 방법으로는 스크립트를 한 번만 시작하고 한 곳에서 모든 코드를 변경해야합니다.

+0

아마도 뭔가를 놓쳤습니다. 모델 내부에 없기 때문에 이름 매개 변수가없는 문제를 어떻게 해결할 수 있습니까? (긴급한 문제는 아니며 문제의 페이지에 대한 모델을 만들었지 만 ViewData.TemplateInfo.HtmlFieldPrefix를 남용하는 것보다 더 나은 방법을 여전히 좋아합니다. – Dave