MVcHtmlString中的堆栈溢出异常

时间:2016-06-23 22:49:55

标签: c# asp.net-mvc mvchtmlstring asp.net-mvc-helpers

我创建了自己的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<TModel, TValue>(this HtmlHelper<TModel> html,
     Expression<Func<TModel, TValue>> expression, string labelText, Object htmlAttributes)
  {
      return myLabelFor(html, expression, labelText, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
  }    

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

public static MvcHtmlString myLabelFor<TModel, TValue>(this HtmlHelper<TModel> html,
   Expression<Func<TModel, TValue>> expression, IDictionary<String, Object> htmlAttributes)
  {
      return LabelHelper(html, ModelMetadata.FromLambdaExpression(expression, html.ViewData),
          ExpressionHelper.GetExpressionText(expression), null, htmlAttributes);
  }

  public static MvcHtmlString myLabelFor<TModel, TValue>(this HtmlHelper<TModel> html,
  Expression<Func<TModel, TValue>> expression)
  {
      return LabelHelper(html, ModelMetadata.FromLambdaExpression(expression, html.ViewData),
          ExpressionHelper.GetExpressionText(expression), null);
  }

  public static MvcHtmlString myLabelFor<TModel, TValue>(this HtmlHelper<TModel> html,
      Expression<Func<TModel, TValue>> 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<String, Object> htmlAttributes = null)

逻辑上,我希望参数labelText的值为&#34;删除原因&#34;从上面的代码行。但是,它在我的3参数方法中抛出了StackOverflowException。 Microsoft description含糊不清,additional explanation没有帮助,additional solution正在使用

Expression<Func<TModel, string>> expression instead of my Expression<Func<TModel, TValue>> expression

我不明白我做错了什么。在这一点上,我只能想到&#34;摆弄参数直到它工作&#34;,但我希望有更优雅的解决方案来解决这个问题。

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

1 个答案:

答案 0 :(得分:2)

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

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(...)的第4次重载不会引发异常的原因是因为它调用了第二次重载,而第二次重载又调用return LabelHelper(...)

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