gpt4 book ai didi

asp.net-mvc-3 - TextBoxFor 与 EditorFor、htmlAttributes 与additionalViewData

转载 作者:行者123 更新时间:2023-12-02 02:57:35 36 4
gpt4 key购买 nike

我创建了一个默认的 MVC 3 项目(使用 razor),以演示问题。

在登录页面上,有一行:

@Html.TextBoxFor(m => m.UserName)

如果我将其更改为:

@Html.TextBoxFor(m => m.UserName, new { title = "ABC" })

然后它被渲染为(带有标题属性):

<input data-val="true" data-val-required="The User name field is required." id="UserName" name="UserName" title="ABC" type="text" value="" />

但是,如果我将其设为 EditorFor:

 @Html.EditorFor(m => m.UserName, new { title = "ABC" })

然后它被渲染(没有标题属性)为:

<input class="text-box single-line" data-val="true" data-val-required="The User name field is required." id="UserName" name="UserName" type="text" value="" />

所以综上所述,当我使用EditorFor时,标题属性丢失了。

我知道 TextBoxFor 的第二个参数称为 htmlAttributes,EditorFor 的第二个参数称为 extraViewData,但是我见过一些示例,其中 EditorFor 可以呈现随此参数提供的属性。

谁能解释一下我做错了什么,以及如何在使用 EditorFor 时拥有标题属性?

最佳答案

我想我找到了一个更好的解决方案。 EditorFor接受additionalViewData作为参数。如果你给它一个名为“htmlAttributes”的参数和属性,那么我们可以用它做一些有趣的事情:

@Html.EditorFor(model => model.EmailAddress,
new { htmlAttributes = new { @class = "span4",
maxlength = 128,
required = true,
placeholder = "Email Address",
title = "A valid email address is required (i.e. user@domain.com)" } })

在模板(在本例中为 EmailAddress.cshtml)中,您可以提供一些默认属性:

@Html.TextBox("",
ViewData.TemplateInfo.FormattedModelValue,
Html.MergeHtmlAttributes(new { type = "email" }))

魔法通过这个辅助方法聚集在一起:

public static IDictionary<string, object> MergeHtmlAttributes<TModel>(this HtmlHelper<TModel> htmlHelper, object htmlAttributes)
{
var attributes = htmlHelper.ViewData.ContainsKey("htmlAttributes")
? HtmlHelper.AnonymousObjectToHtmlAttributes(htmlHelper.ViewData["htmlAttributes"])
: new RouteValueDictionary();

if (htmlAttributes != null)
{
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(htmlAttributes))
{
var key = property.Name.Replace('_', '-');
if (!attributes.ContainsKey(key))
{
attributes.Add(key, property.GetValue(htmlAttributes));
}
}
}

return attributes;
}

当然,如果您正在执行原始 HTML,您也可以修改它以呈现属性:

public static MvcHtmlString RenderHtmlAttributes<TModel>(this HtmlHelper<TModel> htmlHelper, object htmlAttributes)
{
var attributes = htmlHelper.ViewData.ContainsKey("htmlAttributes")
? HtmlHelper.AnonymousObjectToHtmlAttributes(htmlHelper.ViewData["htmlAttributes"])
: new RouteValueDictionary();

if (htmlAttributes != null)
{
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(htmlAttributes))
{
var key = property.Name.Replace('_', '-');
if (!attributes.ContainsKey(key))
{
attributes.Add(key, property.GetValue(htmlAttributes));
}
}
}

return MvcHtmlString.Create(String.Join(" ",
attributes.Keys.Select(key =>
String.Format("{0}=\"{1}\"", key, htmlHelper.Encode(attributes[key])))));
}

关于asp.net-mvc-3 - TextBoxFor 与 EditorFor、htmlAttributes 与additionalViewData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6347722/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com