MVcHtmlString中的堆栈溢出exception

我创建了自己的Html Helper,它可以为任何必填字段添加红色星号。

它成功地适用于两者

@Html.myLabelFor(model => model.Description) //and @Html.myLabelFor(model => model.Description, new { /*stuff*/ }) 

但是,一些代码行如下所示

 @Html.myLabelFor(model => model.Description, "Deletion Reason", new { /*stuff*/ }) 

我的方法不是为处理3个参数而设计的,所以我添加了一个可以处理3个参数的调用者

 public static MvcHtmlString myLabelFor(this HtmlHelper html, Expression<Func> expression, string labelText, Object htmlAttributes) { return myLabelFor(html, expression, labelText, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); } 

下面是其他正常工作的方法(包括内部,包含所有必要的代码,我的结构用作参考)

 public static MvcHtmlString myLabelFor(this HtmlHelper html, Expression<Func> expression, IDictionary htmlAttributes) { return LabelHelper(html, ModelMetadata.FromLambdaExpression(expression, html.ViewData), ExpressionHelper.GetExpressionText(expression), null, htmlAttributes); } public static MvcHtmlString myLabelFor(this HtmlHelper html, Expression<Func> expression) { return LabelHelper(html, ModelMetadata.FromLambdaExpression(expression, html.ViewData), ExpressionHelper.GetExpressionText(expression), null); } public static MvcHtmlString myLabelFor(this HtmlHelper html, Expression<Func> expression, Object htmlAttributes) { return myLabelFor(html, expression, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); } //USED ITS STRUCTURE AS A REFERENCE internal static MvcHtmlString LabelHelper(HtmlHelper html, ModelMetadata metadata, String htmlFieldName, String labelText = null, IDictionary htmlAttributes = null) 

从逻辑上讲,我期望参数labelText从上面的代码行中获取“删除原因”的值。 但是,它在我的3参数方法中抛出了StackOverflowException。 微软的描述含糊不清, 额外的解释没有帮助,并且正在使用其他解决方案

 Expression<Func> expression instead of my Expression<Func> expression 

我不明白我做错了什么。 在这一点上,我只能想到“在它工作之前调整参数”,但我希望有更优雅的解决方案来解决这个问题。

PS:如果我的内部帮助代码有助于解决问题,请告诉我。

您在第一次重载时遇到exception,因为该方法以递归方式调用自身,并一直这样做,直到执行堆栈溢出。 而不是自称你需要改变

 return myLabelFor(html, expression, labelText, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); 

 return LabelHelper(html, ModelMetadata.FromLambdaExpression(expression, html.ViewData), ExpressionHelper.GetExpressionText(expression), labelText, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); 

你的注释,你的第四个重载使用return myLabelFor(...)不会抛出exception的原因是因为它调用你的第二个重载,它反过来调用return LabelHelper(...)

我建议您更改第4个重载以直接调用LabelHelper() ,并更改所有公共重载以显式调用LabelHelper() ,传递所有4个参数,这是内置的`HtmlHelper扩展方法使用的模式(您可以在这里查看LabelFor()的源代码 )