如何在自定义编辑器模板中获取模型的字段名称

时间:2011-07-07 18:45:17

标签: asp.net-mvc-3

我正在为文本区域控件构建我的第一个自定义编辑器模板。到目前为止我的代码是 -

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
<%= Html.TextAreaFor( Model => Model , 2, 30, 
     new { @class = "html", @placeholder = ViewData.ModelMetadata.Watermark }) %>

到目前为止并不多,但确实有效。但是我们需要添加一个字符计数器字段来显示用户可以键入的剩余字符数。我知道如何使用所有JavaScript来使其工作。

因此,为了使命名系统保持一致,我将添加一个名为“.charCounter”的控件来显示剩余的剩余字符数。我的问题是我无法弄清楚能够检索模型的字段名称的正确语法。

最终版本看起来像(JavaScript省略) -

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
<%= Html.TextAreaFor( Model => Model , 2, 30, 
     new { @class = "html", @placeholder = ViewData.ModelMetadata.Watermark }) %>
<span class="xxx">Remaining characters - 
     <input readonly type="text" name="<fieldName>.charCounter" />
</span>

4 个答案:

答案 0 :(得分:30)

您可以使用ViewData.TemplateInfo.HtmlFieldPrefix,如下所示:

<input 
    readonly="readonly" 
    type="text" 
    name="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>.charCounter" 
/>

答案 1 :(得分:16)

我遇到了一个问题,其中PropertyName没有返回Model前缀,例如Contact.FirstName。我能够使用它返回HTML字段Id:

@ViewData.TemplateInfo.GetFullHtmlFieldId("")

<强>返回: Contact_FirstName

您可以使用以下方式返回字段名称:

@ViewData.TemplateInfo.GetFullHtmlFieldName("")

<强>返回:

Contact.FirstName

答案 2 :(得分:3)

ViewData.ModelMetadata.PropertyName在MVC3中运行良好。

剃须刀:

<input readonly="readonly" type="text" name="@ViewData.ModelMetadata.PropertyName">

答案 3 :(得分:1)

获取模型名称/ Id(例如 BirthDate ):

function A(data){...};

function b(referenceToFunctionA){
    ...
    referenceToFunctionA(someData);
    ...
}; 
// correct
b(A);

// wrong, because adding () after any function reference variable
// invokes the method immediately.
// in this particular case the returned value of the method A
// is passed as argument instead of the reference to method A itself.
b(A());

获取带有复杂对象前缀的模型名称(例如 Identity.Person.BirthDate ):

ViewData.ModelMetadata.PropertyName;

@Html.NameFor(m => Model);

获取带有复杂对象前缀的模型Id(例如 Identity_Person_BirthDate ):

ViewData.TemplateInfo.HtmlFieldPrefix;

@Html.IdFor(m => Model)