问题
I'm trying to use EditorFor custom templates.
I want to create a Int32 and decimal templates to render the inputs with some validations.
This is what I'm trying
@model int?
@Html.TextBoxFor(model => model, null, new { @type="text", @oninput = "this.value=this.value.replace(/[^0-9]/g,'')" } )
And I call it like
@Html.EditorFor(x => x.ExampleIntField)
It renders an <input type="text", oninput="this.value=this.value.replace(/[^0-9]/g,'')"
To here everything works, but when I try to pass extra htmlAttributes like readonly
I don't understand how I must receive it in EditorFor template.
Example
@Html.EditorFor(x => x.ExampleIntField, new { htmlAttributes = new { @readonly = "readonly" } } )
I tried this I got the exact same <input type="text", oninput="this.value=this.value.replace(/[^0-9]/g,'')"
rendered without readonly attribute
回答1:
You are using the overload of EditorFor()
that passes the object as additionalViewData
. You can read that within the template from the ViewDataDictionary
@model int?
@{ var attributes = ViewData["htmlAttributes"]; } // returns { @readonly = "readonly" }
which you could then merge with your existing attributes and use in the TextBoxFor()
method.
@{
var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(attributes);
htmlAttributes.Add("oninput", "this.value=this.value.replace(/[^0-9]/g,'')";
}
@Html.TextBoxFor(model => model, htmlAttributes)
Note that TextBoxFor()
generates type="text"
so there is no need to add it again. In addition, you do not need the leading @
unless its a reserved keyword (for example @class = "..."
)
来源:https://stackoverflow.com/questions/50061954/custom-editorfor-template-and-htmlattributes