为字符串属性ASP.NET MVC4创建EditorTemplate

时间:2015-04-07 19:22:38

标签: c# asp.net-mvc-4 mvc-editor-templates

当我在表单中使用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之类的属性是String类型,因此在我的Shared文件夹中,我创建了EditorTemplates文件夹并创建了一个String.cshtml文件来定义String的编辑器的外观。当运行表单的测试时,它似乎运行良好,因为生成的输入字段具有我指定的外观 - 问题是当我使用这些自定义输入字段提交表单时,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'属性,这些属性与我的类中的属性名称相关,并且用于将值绑定到我的类。那么如何更改String.cshtml中的代码以包含这些属性并动态设置它们的值?因为它应该用于我班上的各种属性吗?

2 个答案:

答案 0 :(得分:4)

您可以使用:

@model string

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
                new
                {
                    @class = "form-control",
                    placeholder = ViewData.ModelMetadata.Watermark 
                                  ?? ViewData.ModelMetadata.DisplayName 
                                  ?? ViewData.ModelMetadata.PropertyName
                })

如果您不想要,请移除占位符。

Re:占位符,这是用户可以在输入中输入的内容的提示。您可以使用注释来装饰模型属性:

[Display(Name = "Client")]
public int ClientId { get; set; }

[Display(Prompt = "Please enter mailing Name")]
public string MailingName { get; set; }

如果你使用这样的东西,你的输入将有占位符属性,其值取自这些注释,按照编辑器模板中指定的顺序(提示(水印),名称,然后是属性的名称)。

答案 1 :(得分:0)

不要使用EditorTemplate for String,只需使用TextBoxFor,如下所示:

@Html.TextBoxFor(model => model.UserName, new { @class = "form-control" })

顺便说一下,为String类型创建EditorTemplate不是一个好主意。 String类型太笼统了。您可能希望对String类型的不同字段使用不同的EditorTemplates。

相关问题