[원] ASP.NET MVC 3 Razor 폼은 좀 더 직설적으로 볼 수 있어요.

3581 단어 asp.net
전재는 저자(think 8848)와 출처를 밝혀 주십시오(http://think8848.cnblogs.com)
본인의 관례에 따라 개편할 때 주제와 무관한 말을 먼저 하려고 했습니다. 원래 블로그를 쓰는 이 습관을 견지하려고 했습니다. 우수한 제품이 나오지 않아도 약간의 물품이 나올 수 있고 작은 문제에 대해 해결 방안을 제공할 수 있습니다. 그러나 올해 8월은 정말 다사다난한 가을이라고 할 수 있습니다. 많은 일들이 한데 모여서 새로운 것을 배울 시간이 거의 없습니다.블로그를 쓰는 것은 말할 것도 없고 9월이 반쯤 지나갈 것 같아서 어제서야 작은 것 하나를 참았는데, 아직 머릿수만 채울 수 있을 것 같았다.
ASP를 사용할 예정입니다.NET MVC가 회사의 어떤 제품을 실현했습니다. 어제 문제가 발생했습니다. 이상이 발생했을 때 제출하기 전의 페이지로 돌아간 후에 원래 입력한 내용이 없어졌습니다. 이것은 큰 문제입니다. 예전에 제가 를 썼던 것을 기억합니다.한 문장에 이미 이 문제를 해결했는데 어째서 제출하기 전의 입력이 보이지 않습니까? 이전의 코드를 열어 보니 문제가 발견되었습니다.
현재 코드의 양식 코드는 다음과 같습니다.
<input id="txtName" name="Name" type="text" />


이전에 효과가 나타날 수 있는 폼 코드는 다음과 같다.
@Html.TextBoxFor(x => x.Name)


테스트를 통해 Html의 확장 방법을 사용하여 생성된 라벨은 제출하기 전의 값을 얻을 수 있으나, 자신이 직접 쓴 것은 안 된다는 것을 알 수 있습니다. 따라서 이 TextBox 확장 방법에는 반드시 어떤 메커니즘이 있어 라벨에 자동으로 값을 채울 수 있습니다.처음에 동료와 토론을 한 후에 @Html을 사용하라고 느꼈습니다.TextBoxFor 방법의 장점은 Name 속성의 이름을 바꾸면 VS 코드를 자동으로 재구성해서 *.cshtml 코드의 x.Name은 자동으로 새로운 속성 이름으로 업데이트되었습니다. 테스트를 한 결과 원래 이런 일이 아니었음을 발견했습니다. 예를 들어 Pname은 VS 재구성 코드를 사용했는데 보기에서 속성 이름이 바뀌지 않았음을 발견했습니다.그리고 만약에 Html의 확장 방법을 사용한다면 문제가 있는 것 같다. 가장 중요한 것은 직관적이지 않다는 것이다. 현재의 Razor 엔진에서 뚜렷하지 않다. 어차피 디자이너도 없지만 나중에 Razor 엔진에 디자이너 기능이 생기면 기본적으로 @Html를 사용한다고 단정할 수 있다.TextBoxFor () 방식은 보이는 대로 효과를 내기 어려울 뿐만 아니라 cshtml 페이지에서 디자이너를 사용할 수 없습니다. 코드를 볼 때 보기에서 @Html를 사용하면 됩니다.XXX도 직관적이지 않다. Html 확장 방법을 사용하면 코드를 재구성하는 데 유리하지 않고 직관적이지 않기 때문에 Html 라벨을 사용하는 이유가 충분히 변한 것 같다. 이런 방법을 사용하면 C#를 할 줄 모르는 사람도 페이지를 쓸 수 있다.
이런 생각의 구동 아래, 스스로 탭 값을 채우는 확장 방법을 생각해 낸다.그래서 ASP를 열었습니다.NET MVC 3 소스 코드, 이 TextBox 내부에서 도대체 무엇을 하고 있는지, 왜 모델(ViewData.Model)의 값과 ViewData를 사용할 수 있는지 살펴보자.ModelState의 값이 탭에 채워져서 한 걸음 한 걸음 찾아보면 원래 실현 방법이 비교적 간단하고 코드에 직접 올라가는 것을 발견할 수 있다.
    public static class HtmlValueExtension

    {

        public static MvcHtmlString Value<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression)

        {

            ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);



            return Value(html, metadata.PropertyName);

        }



        public static MvcHtmlString Value(this HtmlHelper html, string name)

        {

            string attemptedValue = null;

            ModelState modelState;



            if (html.ViewData.ModelState.TryGetValue(name, out modelState))

            {

                if (modelState.Value != null)

                {

                    attemptedValue = modelState.Value.ConvertTo(typeof(string), null /* culture */).ToString();

                }

            }



            return new MvcHtmlString(attemptedValue ?? Convert.ToString(html.ViewData.Eval(name), CultureInfo.CurrentCulture));

        }

    }


HtmlHelper의 확장 방법인Value를 정의한 다음에 Lambda 표현식에 따라 지정한 속성의 메타데이터를 얻습니다. 우선적으로 ModelState에서 대응하는 데이터, 즉 앞쪽 폼 데이터를 제출하는 것을 고려하고 이 데이터가null이면 ViewData를 시도합니다.Model에서 지정한 데이터는 간단하죠:)
이 클래스를 사용하면 페이지에서 다음 코드를 사용하여 호출됩니다.
                <input id="txtDeptName" name="Name" type="text" value="@Html.Value(x => x.Name)"/>


이렇게 하면 @Html에 도달할 수 있습니다.TextBox()와 같은 효과가 있었지만 보기의 코드 측면에서 볼 때 많이 직관적이었고 앞으로 Razor 엔진에 디자이너가 생기면 디버깅을 하지 않아도 페이지 효과를 볼 수 있을 것 같다.  
마지막으로 Razor의 보기에서 폼 탭을 정의한다면, 이 폼 탭의 값은 모델의 속성에 대응하지 않습니다. 제출 전의 값을 가져오려면 Request를 사용하십시오.Params[TagName]를 클릭하면 됩니다.

좋은 웹페이지 즐겨찾기