获取表单字段的生成客户端ID

15
有没有一种方法可以获取使用html帮助程序生成的字段的客户端id?
我有几个组件有时会在另一个表单中,我想将JavaScript事件附加到它们上面。
例如,我希望能够实现:
@Html.TextBoxFor(model => model.client.email)

<script> 
$('#@getmyusercontrolid(model=>model.client.email)').val("put your mail here");
</script>

1
被接受的答案已经过时了,请查看我的答案以获取更好的解决方案。 - Professor of programming
4个回答

31

我使用这个辅助程序:

public static partial class HtmlExtensions
{
    public static MvcHtmlString ClientIdFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        return MvcHtmlString.Create(htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(ExpressionHelper.GetExpressionText(expression)));
    }
}

使用方式与其他辅助程序相同:@Html.ClientIdFor(model=>model.client.email)


抱歉混淆了比喻,但这个程序像润滑良好的齿轮一样运转顺畅。 - DavidWainwright
你从哪里获取 ExpressionHelper.GetExpressionText 的? - mxmissile
为了在我的页面上使用帮助程序,我必须导入帮助程序所在的命名空间:@import MyWebProj.Helpers。有关更多信息,请参见https://dev59.com/XnA75IYBdhLWcg3wipqH(还可以使用Views文件夹中的web.config来处理导入) - Juha Palomäki
1
你本可以使用 html.IdFor(expression) - Professor of programming
截至MVC 4版本,这个已经过时了。对于未来的读者——IdFor现在可以直接实现这个功能;请参见@Bonner웃的回答 - Eric Eskildsen

11

MVC 5有NameFor,因此您使用它的示例如下:

@Html.TextBoxFor(model => model.client.email)

<script> 
$('#@Html.NameFor(model => model.client.email)').val("put your mail here");
</script>

编辑

IdFor也可用,这可能比NameFor在这种情况下更合适。


9

使用@Html.IdFor(model => model.client.email),因为此功能已经存在,可以这样使用:

@Html.TextBoxFor(model => model.client.email)

<script> 
$('#@Html.IdFor(model => model.client.email)').val("put your mail here");
</script>

你可以在以下页面阅读更多相关信息: https://msdn.microsoft.com/zh-cn/library/hh833709%28v=vs.118%29.aspx。该页面涉及IT技术。

5
您可以尝试在生成输入字段时在HtmlAttributes参数中指定id,例如:
@Html.TextBoxFor(model => model.client.email, new { id = "emailTextBox" })

然后你可以在JavaScript中使用这个。
var email = $('#emailTextBox').val();

如果在同一页中有多个组件实例,那么这种方法将无法正常工作,而且如果您想要在目标操作中进行数据绑定,它也没有用处。 - Jokin
我知道这是一个旧答案,但是...在使用MVC和Razor视图引擎时,您需要使用@符号转义id,例如:@id="emailTextBox" - Chef_Code

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接