여러 줄 텍스트 상자의 최대 길이 지정
ASP를 사용하려고 합니다.
<asp:TextBox ID="txtInput" runat="server" TextMode="MultiLine"></asp:TextBox>
나는 그것을 명시하는 방법을 원합니다.maxlength재산, 하지만 분명히 가능한 방법은 없습니다.multiline textbox나는 몇 가지 자바스크립트를 사용하려고 노력해 왔습니다.onkeypress 트이벤::
onkeypress="return textboxMultilineMaxNumber(this,maxlength)"
function textboxMultilineMaxNumber(txt, maxLen) {
try {
if (txt.value.length > (maxLen - 1)) return false;
} catch (e) { }
return true;
}
이 JavaScript 기능의 문제는 잘 작동하지만 문자를 작성한 후 문자를 삭제하거나 대체할 수 없다는 것입니다.
그것을 피하기 위해 위의 코드에서 제가 무엇을 바꿀 수 있는지 또는 다른 방법이 있는지 아십니까?
대신 정규식 검증자를 사용합니다.이것은 JavaScript를 사용하는 클라이언트에서 작동하지만 JavaScript가 비활성화된 경우에도 작동합니다(서버에서도 길이 검사가 수행됨).
다음 예제에서는 입력한 값의 길이가 0에서 100자 사이인지 확인합니다.
<asp:RegularExpressionValidator runat="server" ID="valInput"
ControlToValidate="txtInput"
ValidationExpression="^[\s\S]{0,100}$"
ErrorMessage="Please enter a maximum of 100 characters"
Display="Dynamic">*</asp:RegularExpressionValidator>
물론 여러분의 목적에 더 잘 맞게 사용할 수 있는 더 복잡한 정규식이 있습니다.
다음 Javascript를 사용해 보십시오.
function checkTextAreaMaxLength(textBox,e, length)
{
var mLen = textBox["MaxLength"];
if(null==mLen)
mLen=length;
var maxLength = parseInt(mLen);
if(!checkSpecialKeys(e))
{
if(textBox.value.length > maxLength-1)
{
if(window.event)//IE
e.returnValue = false;
else//Firefox
e.preventDefault();
}
}
}
function checkSpecialKeys(e)
{
if(e.keyCode !=8 && e.keyCode!=46 && e.keyCode!=37 && e.keyCode!=38 && e.keyCode!=39 && e.keyCode!=40)
return false;
else
return true;
}
컨트롤에서 다음과 같이 호출합니다.
<asp:TextBox Rows="5" Columns="80" ID="txtCommentsForSearch" MaxLength='1999' onkeyDown="checkTextAreaMaxLength(this,event,'1999');" TextMode="multiLine" runat="server"> </asp:TextBox>
또한 javascript 구현에 대한 입력의 유효성을 검사하기 위해 checkSpecialKeys 함수를 사용할 수 있습니다.
단순하게 받아들여라.대부분의 최신 브라우저는 텍스트 영역(IE 포함)에서 최대 길이 속성을 지원하므로 코드 뒤에 해당 속성을 추가하기만 하면 됩니다.JS도 없고, Jquery도 없고, 상속도 없고, 커스텀 코드도 없고, 소란도 없고, 머스도 없습니다.
VB.Net:
fld_description.attributes("maxlength") = 255
C#
fld_description.Attributes["maxlength"] = 255
직접 굴리기:
function Count(text)
{
//asp.net textarea maxlength doesnt work; do it by hand
var maxlength = 2000; //set your value here (or add a parm and pass it in)
var object = document.getElementById(text.id) //get your object
if (object.value.length > maxlength)
{
object.focus(); //set focus to prevent jumping
object.value = text.value.substring(0, maxlength); //truncate the value
object.scrollTop = object.scrollHeight; //scroll to the end to prevent jumping
return false;
}
return true;
}
다음과 같은 통화:
<asp:TextBox ID="foo" runat="server" Rows="3" TextMode="MultiLine" onKeyUp="javascript:Count(this);" onChange="javascript:Count(this);" ></asp:TextBox>
HTML5의 상황이 바뀌었습니다.
ASPX:
<asp:TextBox ID="txtBox" runat="server" maxlength="2000" TextMode="MultiLine"></asp:TextBox>
C#:
if (!IsPostBack)
{
txtBox.Attributes.Add("maxlength", txtBox.MaxLength.ToString());
}
렌더링된 HTML:
<textarea name="ctl00$DemoContentPlaceHolder$txtBox" id="txtBox" maxlength="2000"></textarea>
다음에 대한 메타데이터Attributes:
요약: 컨트롤의 속성과 일치하지 않는 임의 특성(렌더링 전용)의 컬렉션을 가져옵니다.
반환:a
System.Web.UI.AttributeCollection이름과 값 쌍의.
사용자 지정 특성 maxsize="100" 사용
<asp:TextBox ID="txtAddress" runat="server" maxsize="100"
Columns="17" Rows="4" TextMode="MultiLine"></asp:TextBox>
<script>
$("textarea[maxsize]").each(function () {
$(this).attr('maxlength', $(this).attr('maxsize'));
$(this).removeAttr('maxsize');
});
</script>
이것은 이렇게 렌더링될 것입니다.
<textarea name="ctl00$BodyContentPlac
eHolder$txtAddress" rows="4" cols="17" id="txtAddress" maxlength="100"></textarea>
Javascript 없이 텍스트 영역(HTML5)에서 최대 길이를 지원하는 브라우저(Firefox, Chrome, Safari)에서 이 문제를 해결하는 또 다른 방법은 시스템의 하위 클래스를 유도하는 것입니다.웹.UI.웹 컨트롤.TextBox 클래스 및 Render 메서드를 재정의합니다.그런 다음 재정의된 방법에서 정상적으로 렌더링하기 전에 maxlength 특성을 추가합니다.
protected override void Render(HtmlTextWriter writer)
{
if (this.TextMode == TextBoxMode.MultiLine
&& this.MaxLength > 0)
{
writer.AddAttribute(HtmlTextWriterAttribute.Maxlength, this.MaxLength.ToString());
}
base.Render(writer);
}
$('#txtInput').attr('maxLength', 100);
을 HTML과 함께 합니다.runat="server"서버 측에서 액세스할 수 있습니다.이 솔루션은 Javascript나 regex를 사용하는 것보다 고통이 적습니다.
<textarea runat="server" id="txt1" maxlength="100" />
에: 에 액세스하십시오.Text측 은 서측의속, 야합니다성을 해야 합니다.txt1.Value에 txt1.Text
다른 접근 방식을 시도했지만 모두 몇 가지 약점(예: 잘라내기 및 붙여넣기 또는 브라우저 호환성)이 있었습니다.현재 사용하고 있는 솔루션은 다음과 같습니다.
function multilineTextBoxKeyUp(textBox, e, maxLength) {
if (!checkSpecialKeys(e)) {
var length = parseInt(maxLength);
if (textBox.value.length > length) {
textBox.value = textBox.value.substring(0, maxLength);
}
}
}
function multilineTextBoxKeyDown(textBox, e, maxLength) {
var selectedText = document.selection.createRange().text;
if (!checkSpecialKeys(e) && !e.ctrlKey && selectedText.length == 0) {
var length = parseInt(maxLength);
if (textBox.value.length > length - 1) {
if (e.preventDefault) {
e.preventDefault();
}
else {
e.returnValue = false;
}
}
}
}
function checkSpecialKeys(e) {
if (e.keyCode != 8 && e.keyCode != 9 && e.keyCode != 33 && e.keyCode != 34 && e.keyCode != 35 && e.keyCode != 36 && e.keyCode != 37 && e.keyCode != 38 && e.keyCode != 39 && e.keyCode != 40) {
return false;
} else {
return true;
}
}
이 경우, 저는 다중 회선으로 전화를 걸고 있습니다.TextBoxKeyUp on 키업 및 다중 회선TextBoxKeyDown on 키다운:
myTextBox.Attributes.Add("onkeyDown", "multilineTextBoxKeyDown(this, event, '" + maxLength + "');");
myTextBox.Attributes.Add("onkeyUp", "multilineTextBoxKeyUp(this, event, '" + maxLength + "');");
모든 코드를 한 곳에 보관하는 방법은 다음과 같습니다.
<asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine"/>
<% TextBox1.Attributes["maxlength"] = "1000"; %>
2018년에도 웹폼을 사용하는 사람이 있을지도 몰라요.
이것 좀 보세요.해결할 수 있는 유일한 방법은 당신이 시도한 대로 자바스크립트로 해결하는 것입니다.
편집: 이벤트를 키 누르기로 변경해 보십시오.
JavaScript/Jquery의 다음 예제는 이를 수행합니다.
<telerik:RadScriptBlock ID="RadScriptBlock1" runat="server">
<script type="text/javascript">
function count(text, event) {
var keyCode = event.keyCode;
//THIS IS FOR CONTROL KEY
var ctrlDown = event.ctrlKey;
var maxlength = $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val().length;
if (maxlength < 200) {
event.returnValue = true;
}
else {
if ((keyCode == 8) || (keyCode == 9) || (keyCode == 46) || (keyCode == 33) || (keyCode == 27) || (keyCode == 145) || (keyCode == 19) || (keyCode == 34) || (keyCode == 37) || (keyCode == 39) || (keyCode == 16) || (keyCode == 18) ||
(keyCode == 38) || (keyCode == 40) || (keyCode == 35) || (keyCode == 36) || (ctrlDown && keyCode == 88) || (ctrlDown && keyCode == 65) || (ctrlDown && keyCode == 67) || (ctrlDown && keyCode == 86))
{
event.returnValue = true;
}
else {
event.returnValue = false;
}
}
}
function substr(text)
{
var txtWebAdd = $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val();
var substrWebAdd;
if (txtWebAdd.length > 200)
{
substrWebAdd = txtWebAdd.substring(0, 200);
$("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val('');
$("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val(substrWebAdd);
}
}
이 토막글은 제 경우에 효과가 있었습니다.저는 그 해결책을 찾고 있었고 미래의 독자들에게 도움이 될 수 있도록 이것을 쓰려고 생각했습니다.
ASP
<asp:TextBox ID="tbName" runat="server" MaxLength="250" TextMode="MultiLine" onkeyUp="return CheckMaxCount(this,event,250);"></asp:TextBox>
자바스크립트
function CheckMaxCount(txtBox,e, maxLength)
{
if(txtBox)
{
if(txtBox.value.length > maxLength)
{
txtBox.value = txtBox.value.substring(0, maxLength);
}
if(!checkSpecialKeys(e))
{
return ( txtBox.value.length <= maxLength)
}
}
}
function checkSpecialKeys(e)
{
if(e.keyCode !=8 && e.keyCode!=46 && e.keyCode!=37 && e.keyCode!=38 && e.keyCode!=39 && e.keyCode!=40)
return false;
else
return true;
}
@복사/붙여넣기의 경우 Raul Roa Answer가 저에게 도움이 되었습니다.이와 동시에
$("textarea[maxlength]").on("keydown paste", function (evt) {
if ($(this).val().length > $(this).prop("maxlength")) {
if (evt.type == "paste") {
$(this).val($(this).val().substr(0, $(this).prop("maxlength")));
} else {
if ([8, 37, 38, 39, 40, 46].indexOf(evt.keyCode) == -1) {
evt.returnValue = false;
evt.preventDefault();
}
}
}
});
페이지에서 다중 행 텍스트 상자의 최대 길이를 지정할 수 있습니다.Javascript Event 로드
function pageLoad(){
$("[id$='txtInput']").attr("maxlength","10");
}
pageLoad() Javascript 함수에서 txtInput multiline 텍스트 상자의 최대 길이 속성을 10자로 설정했습니다.
이것은 @KeithK의 답변과 동일하지만, 몇 가지 세부 사항을 더 포함합니다.먼저 TextBox를 기반으로 새 컨트롤을 만듭니다.
using System.Web.UI;
using System.Web.UI.WebControls;
namespace MyProject
{
public class LimitedMultiLineTextBox : System.Web.UI.WebControls.TextBox
{
protected override void Render(HtmlTextWriter writer)
{
this.TextMode = TextBoxMode.MultiLine;
if (this.MaxLength > 0)
{
writer.AddAttribute(HtmlTextWriterAttribute.Maxlength, this.MaxLength.ToString());
}
base.Render(writer);
}
}
}
위의 코드는 항상 텍스트 모드를 여러 줄로 설정합니다.
이것을 사용하기 위해서는 aspx 페이지에 등록해야 합니다.TagPrefix를 사용하여 참조해야 하므로 필요합니다. 그렇지 않으면 컴파일이 사용자 지정 일반 컨트롤에 대해 불만을 제기합니다.
<%@ Register Assembly="MyProject" Namespace="MyProject" TagPrefix="mp" %>
<mp:LimitedMultiLineTextBox runat="server" Rows="3" ...
이제 거의 모든 최신 브라우저에서 텍스트 영역 요소에 대한 maxlength 특성 사용을 지원합니다.(https://caniuse.com/ #maxlength=maxlength)
다중 행 TextBox에 maxlength 특성을 포함하려면 코드 뒤에 있는 Attributes 컬렉션을 다음과 같이 수정하면 됩니다.
txtTextBox.Attributes["maxlength"] = "100";
뒤에 있는 코드를 사용하여 이를 지정하지 않으려면 TextBox에서 파생된 사용자 지정 컨트롤을 만들면 됩니다.
public class Textarea : TextBox
{
public override TextBoxMode TextMode
{
get { return TextBoxMode.MultiLine; }
set { }
}
protected override void OnPreRender(EventArgs e)
{
if (TextMode == TextBoxMode.MultiLine && MaxLength != 0)
{
Attributes["maxlength"] = MaxLength.ToString();
}
base.OnPreRender(e);
}
}
MaxLength 이제 .NET 4.7.2에서 지원되므로 프로젝트를 .NET 4.7.2 이상으로 업그레이드하면 자동으로 작동합니다.
이는 릴리스 노트에서 확인할 수 있습니다. 구체적으로 다음과 같습니다.
ASP.NET 개발자가 Multiline asp에 대해 MaxLength 특성을 지정할 수 있습니다.TextBox. [449020, 시스템]웹.dll, 버그]
이것은 확실히 효과가 있습니다: 사용textarea그리고.value
<div class="form-group row">
<label class="col-md-4 col-form-label">Description</label>
<textarea id="txtDescription" class="form-control" style="height: 40px ; width :250px; " runat="server" maxlength="500" tabindex="32" ></textarea>
</div>
</div>
코드:저장 중:-
BusinessLayer.Description = txtDescription.Value.ToString();
값을 다시 가져오는 동안 :-
txtDescription.Value = BusinessLayer.Description.ToString();
중요 사항:사용하는 것을 잊지 마십시오.runat="server"사용하는 것을 잊지 마십시오.value전환하는 동안
언급URL : https://stackoverflow.com/questions/1334286/specifying-maxlength-for-multiline-textbox
'programing' 카테고리의 다른 글
| False일 때 축소된 대신 숨김으로 변환하는 WPF BooleanToVisibilityConverter? (0) | 2023.06.11 |
|---|---|
| 미리 정의된 Oracle pl/SQL 예외의 전체 목록은 어디에서 찾을 수 있습니까? (0) | 2023.06.11 |
| .NET에서 SSIS 패키지를 실행하는 방법은 무엇입니까? (0) | 2023.06.11 |
| 루비의 "and"와 &&의 차이점은 무엇입니까? (0) | 2023.06.11 |
| "malloc(0)"이 null이 아닌 포인터를 반환하면 "free"로 전달할 수 있습니까? (0) | 2023.06.11 |