ASP.NET MVC 3 : TextBoxFor로 "name"특성 재정의


99

을 사용 Html.TextBoxFor하여 이름 속성을 재정의하는 것이 가능 합니까?

나는 성공하지 못했습니다. 클라이언트 측 유효성 검사가 작동하려면 TextBoxFor를 사용해야하지만, 텍스트 상자의 이름이 생성 된 것과 달라야하는 이유는 없습니다.

나는 다음을 시도했다 :

@Html.TextBoxFor(x => x.Data, new { name = Model.Key + "_Data", id = Model.Key + "_Data" })

ID에는 작동하지만 이름은 작동하지 않습니다. 이게 가능해?

업데이트 : TextBoxFor의 코드를 살펴 봅니다. 쉬운 방법이없는 것 같습니다. 누군가가 나를 잘못 증명할 수 있기를 바랍니다.


'데이터'의 데이터 유형은 무엇입니까
archil


2
그 질문들은 약간 다른 것을 요구하고 있습니다. 또한-이것은 세 사람 중 더 오래된 것이므로 복제를 의미한다고 생각합니다.
Rob Stevenson-Leggett

답변:


234

Rob, 실제로 훨씬 더 간단한 방법이 있습니다. name 대신 Name을 사용 하십시오 .

@Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })

11
대소 문자를 구분하는 @highwingers입니다.이 작은 세부 사항은 시간을 절약 할 수 있습니다.
anar khalilov 2013

3
잔인 함 .. 이름 만 아이디 X_X
Vladimirs

2
이상하게도 "id"는 대소 문자를 구분하지 않지만 (Id 및 id와 잘 작동 함) "name"은 그렇지 않습니다.
Vladimirs

10
ASP.NET 4에 제공하는 것과 Name두 특성의 결과, Namename, 상기 모델 바인더 용도 name.
GSerg

1
그러나 이름이 소문자 만 다른 두 개의 서로 다른 속성을 처리하는 유지 보수 악몽위한 조리법이다 .....
제임스 매코맥

41

이름에 접두사를 적용하기 위해 이것을 묻는 것입니까? 그렇다면 ViewData.TemplateInfo.HtmlFieldPrefix컨트롤러에서 설정 하여 이를 수행 할 수 있습니다 .

나는 Brad Wilson의 블로그 에서 이것에 대해 많은 것을 배웠습니다 .


이것은 승자처럼 보입니다! 아름다운.
Rob Stevenson-Leggett

2
네 그들은 멋지게 숨겼습니다. :)
James McCormack

이로 인해 두통과 코드 중복이 절약되었습니다.
davidXYZ

13

EditorFor에는 name속성을 매개 변수로 제공 할 수있는 오버로드가 있습니다 .

 @Html.EditorFor(expression, null, name)

1
이 시간 전에 찾았다면 시간을 절약했을 것입니다. haha
Johnie Karr

흥미롭지 만 DropDownListFor와 같은 유사한 헬퍼에 대한 name 속성에 대한 오버로드는 없습니다. html 속성 매개 변수 (이름에 대문자 N 포함)에 지정해야합니다.
nmit026

8

시도 EditorFor을 . 속성 유형이 문자열이 아닌 경우에도 텍스트 상자가 렌더링되도록하려면 문자열을 템플릿 이름으로 전달할 수 있습니다. 속성이 이미 문자열 인 경우 templatename텍스트 상자를 렌더링하는 데 명시 적으로 필요하지 않으므로 null. id 매개 변수가 명시 적으로 필요하지 않으며 요소 이름에서 유추됩니다. 그리고 모든 유효성 검사는 EditorFor에서 여전히 활성화되어 있습니다.

 @Html.EditorFor(x => x.Data, "string", Model.Key + "_Data")

7

ben의 대답은 Html.Raw로 포장해야한다는 점을 제외하고는 내가 찾던 것을 얻었습니다.

@Html.Raw(Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData"))

4

전화 Microsoft GOTCHA입니다

이름을 대문자로 사용하십시오.

@Html.TextBoxFor(m => m.Reply.Answer, new {@Name="Whatyouwant"})

3

약간 "unpretty"=), 시도해보십시오 :

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")

그것을하는 좋은 쉬운 방법 인 것 같습니다. 만약 조금 해키 :-)
Rob Stevenson-Leggett

음, 이런 식으로, 당신은 그냥 보통의 Html.TexBox ..를 취하지 않을 것입니다. 어떤 정적 타이핑도 대체 후에 사라졌기 때문입니다
sharp johnny

1

저에게는 작동합니다! 도움이 되었기를 바랍니다.

@Html.EditorFor(model => model.Nome, new { htmlAttributes = new { @class = "form-control", @maxlength = "80", @id = "NomeFilter", @Name = "NomeFilter" } })

1
@Html.EditorFor(Model => Model.Something, "name", "name", new {@class = "form-control" })

중간에있는 두 문자열 매개 변수 중 어느 것이 작동하는지 확실하지 않지만 둘 다 입력했을 때만 작동했습니다.


ID와 이름입니다. 이것은 나를 위해 일했습니다. 나는 위의 모든 답변을 통과했지만 그들 중 아무것도 작동하지 않았지만 이것은 1. 감사합니다.
Orion

public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);. 무엇을해야할지 templateName몰라서 null. 들어 htmlFieldName나는 (내 경우 "IPMI"대신 "IPMI"의) 매개 변수의 이름을 사용했다. 그것은 나를위한 속임수였습니다.
BCdotWEB

0

이 예에서는 권한에 따라 양식 필드를 비활성화했지만 여전히 표시합니다. 컨트롤러에 값을 보낼 숨겨진 필드가 있었지만 EditorFor에서 다른 필드 이름을 원했습니다. 모델 값 뒤의 첫 번째 매개 변수는 "이름"속성을 나타내고 두 번째는 새 이름입니다.

@Html.EditorFor(m => m.UserName, "name", "UserNameDisabled", new { htmlAttributes = new { @class = "form-control", @disabled = "disabled"} });

결과 :

<input class="form-control text-box single-line" disabled="disabled" id="UserNameDisabled" name="UserNameDisabled" type="text" value="someEnteredValue" /> 

0

간단하게 유지하십시오. 이미 제공 한 ID는 "TextBoxFor"대신 "TextBox"메서드를 사용할 수 있어야하며 클라이언트 측과 서버 측에서 잘 작동합니다. 또한 수락 된 답변은 작동하지만 브라우저를 사용하여 검사하면 태그에 중복 된 Name 속성이 생성됩니다. 아래 솔루션에는 그 문제가 없습니다.

MvcHtmlString Html.TextBox (문자열 이름, 문자열 값, 객체 htmlAttributes)

@Html.TextBox(Model.Key + "_Data", Model.Key, new { id = Model.Key + "_Data" }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.