asp.net-mvc - 부분 - viewbag 사용법




Razor로 일반적인 @helper 메소드를 생성 할 수 있습니까? (3)

모든 경우에 TModel 은 (뷰에 대해 선언 된 모델과) 동일 할 것이고, 제 경우에는 TValue 가 같기 때문에 Expression 인자 타입을 선언 할 수있었습니다 :

@helper FormRow(Expression<Func<MyViewModel, MyClass>> expression) {
  <div class="form-group">
    @(Html.LabelFor(expression, new { @class = "control-label col-sm-6 text-right" }))
    <div class="col-sm-6">
      @Html.EnumDropDownListFor(expression, new { @class = "form-control" })
    </div>
    @Html.ValidationMessageFor(expression)
  </div>
}

모델 필드가 모두 string 이면 MyClassstring 바꿀 수 있습니다.

정의 된 TValue 2 ~ 3 개의 도우미를 정의하는 것은 좋지 않을 수도 있지만 더 많은 코드가 생성되면 더 좋은 코드를 생성 할 수 있습니다. @helper@functions {} 블록 안에 넣은 함수에서 래핑하려고했으나 결코 그 경로를 사용하지 못했습니다.

Razor에서 다음과 같은 도우미를 쓰려고합니다.

@helper DoSomething<T, U>(Expression<Func<T, U>> expr) where T : class

불행히도 파서는 <T 가 HTML 요소의 시작이라고 생각하고 구문 오류로 끝납니다. Razor로 도우미를 만드는 것이 일반적인 방법입니까? 그렇다면 구문은 무엇입니까?


아니, 불가능합니다. 대신에 일반 HTML 도우미를 작성할 수 있습니다.

public static MvcHtmlString DoSomething<T, U>(
    this HtmlHelper htmlHelper, 
    Expression<Func<T, U>> expr
) where T : class
{
    ...
}

그리고:

@(Html.DoSomething<SomeModel, string>(x => x.SomeProperty))

또는 모델을 첫 번째 일반 인수로 타겟팅하는 경우 :

public static MvcHtmlString DoSomething<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expr
) where T : class
{
    ...
}

이것은 당신이 이것을 (당신의 뷰가 강하게 입력되었다고 가정하면, 모든 뷰가 강하게 타이핑되어야하기 때문에 안전한 가정이다 :-)) :

@Html.DoSomething(x => x.SomeProperty)

@functions 구문을 사용하여 도우미 파일을 만들 수 있지만 참조하는 면도기 스타일의 가독성을 원하면 일반 도우미를 호출하여 HTML을 맞추고 끝내야합니다.

Helper 파일의 함수는 정적이므로 메서드를 사용하려는 경우 페이지의 HtmlHelper 인스턴스를 전달해야합니다.

예 : Views \ MyView.cshtml :

@MyHelper.DoSomething(Html, m=>m.Property1)
@MyHelper.DoSomething(Html, m=>m.Property2)
@MyHelper.DoSomething(Html, m=>m.Property3)

App_Code \ MyHelper.cshtml :

@using System.Web.Mvc;
@using System.Web.Mvc.Html;
@using System.Linq.Expressions;
@functions
{
    public static HelperResult DoSomething<TModel, TItem>(HtmlHelper<TModel> html, Expression<Func<TModel, TItem>> expr)
    {
        return TheThingToDo(html.LabelFor(expr), html.EditorFor(expr), html.ValidationMessageFor(expr));
    }
}
@helper TheThingToDo(MvcHtmlString label, MvcHtmlString textbox, MvcHtmlString validationMessage)
{
    <p>
        @label
        <br />
        @textbox
        @validationMessage
    </p>
}
...




razor