为字符串属性创建 EditorTemplate ASP.NET MVC4
Creating EditorTemplate for string properties ASP.NET MVC4
当我在表单中使用 Html.EditorFor 助手时,我希望能够自定义标签的外观,因此我定义了一个 EditorTemplate 来实现这一点。这就是我的表单在我看来的样子:
@model Models.SimpleUserClass
@{
ViewBag.Title = "Create User";
}
<div class="row">
<div class="col-lg-6" id="FromPlaceHoler">
@using (Html.BeginForm("CreateUser", "Users"))
{
<fieldset>
<legend>Create One Way Trip</legend>
<div class="editor-label">
@Html.LabelFor(model => model.UserName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserSurname)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserSurname)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserAge)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserAge)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserGender)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserGender)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
</div>
</div>
UserName 和 Surname 等属性属于字符串类型,因此在我的共享文件夹中,我创建了 EditorTemplates 文件夹并创建了一个 String.cshtml 文件来定义字符串编辑器的外观。当 运行 测试表单时,它似乎运行良好,因为生成的输入字段具有我指定的外观 - 问题是当我使用这些自定义输入字段提交表单时,mvc 无法映射我的表单字段到我的模型。这样做的原因是标签需要支持此绑定到模型的属性。下面是一个例子:
这是我在 String.cshtml EditorTemplate 中的代码:
<input type="text" class="form-control">
并且在不进行自定义的情况下使用默认的 EditorFor 时,它会生成以下标记:
<input data-val="true" data-val-required="The User Name field is required." id="UserName" name="UserName" type="text" value="" />
正如我们在上面看到的,我的代码没有 'id' 和 'name' 属性,这些属性与我的 class 中的属性名称相关并且用于绑定我的 class 的值。那么如何更改 String.cshtml 中的代码以包含这些属性并动态设置它们的值呢?因为它应该用于我的 class?
中的各种属性
不要为字符串使用 EditorTemplate,只需像这样使用 TextBoxFor:
@Html.TextBoxFor(model => model.UserName, new { @class = "form-control" })
你可以使用这个:
@model string
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
new
{
@class = "form-control",
placeholder = ViewData.ModelMetadata.Watermark
?? ViewData.ModelMetadata.DisplayName
?? ViewData.ModelMetadata.PropertyName
})
如果不需要,请删除占位符。
回复:占位符,这是提示用户可以在输入中输入什么。您可以使用注释装饰您的模型属性:
[Display(Name = "Client")]
public int ClientId { get; set; }
[Display(Prompt = "Please enter mailing Name")]
public string MailingName { get; set; }
如果你使用这样的东西,那么你的输入将具有占位符属性,其中的值取自这些注释,按照编辑器模板中指定的顺序(提示(水印),名称,然后是 属性).
当我在表单中使用 Html.EditorFor 助手时,我希望能够自定义标签的外观,因此我定义了一个 EditorTemplate 来实现这一点。这就是我的表单在我看来的样子:
@model Models.SimpleUserClass
@{
ViewBag.Title = "Create User";
}
<div class="row">
<div class="col-lg-6" id="FromPlaceHoler">
@using (Html.BeginForm("CreateUser", "Users"))
{
<fieldset>
<legend>Create One Way Trip</legend>
<div class="editor-label">
@Html.LabelFor(model => model.UserName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserSurname)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserSurname)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserAge)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserAge)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserGender)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserGender)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
</div>
</div>
UserName 和 Surname 等属性属于字符串类型,因此在我的共享文件夹中,我创建了 EditorTemplates 文件夹并创建了一个 String.cshtml 文件来定义字符串编辑器的外观。当 运行 测试表单时,它似乎运行良好,因为生成的输入字段具有我指定的外观 - 问题是当我使用这些自定义输入字段提交表单时,mvc 无法映射我的表单字段到我的模型。这样做的原因是标签需要支持此绑定到模型的属性。下面是一个例子:
这是我在 String.cshtml EditorTemplate 中的代码:
<input type="text" class="form-control">
并且在不进行自定义的情况下使用默认的 EditorFor 时,它会生成以下标记:
<input data-val="true" data-val-required="The User Name field is required." id="UserName" name="UserName" type="text" value="" />
正如我们在上面看到的,我的代码没有 'id' 和 'name' 属性,这些属性与我的 class 中的属性名称相关并且用于绑定我的 class 的值。那么如何更改 String.cshtml 中的代码以包含这些属性并动态设置它们的值呢?因为它应该用于我的 class?
中的各种属性不要为字符串使用 EditorTemplate,只需像这样使用 TextBoxFor:
@Html.TextBoxFor(model => model.UserName, new { @class = "form-control" })
你可以使用这个:
@model string
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
new
{
@class = "form-control",
placeholder = ViewData.ModelMetadata.Watermark
?? ViewData.ModelMetadata.DisplayName
?? ViewData.ModelMetadata.PropertyName
})
如果不需要,请删除占位符。
回复:占位符,这是提示用户可以在输入中输入什么。您可以使用注释装饰您的模型属性:
[Display(Name = "Client")]
public int ClientId { get; set; }
[Display(Prompt = "Please enter mailing Name")]
public string MailingName { get; set; }
如果你使用这样的东西,那么你的输入将具有占位符属性,其中的值取自这些注释,按照编辑器模板中指定的顺序(提示(水印),名称,然后是 属性).