【问题标题】:using HtmlHelper in javascript with MVC and DataAnnotations jqGrid在带有 MVC 和 DataAnnotations jqGrid 的 javascript 中使用 HtmlHelper
【发布时间】:2013-04-17 23:14:48
【问题描述】:

我创建了一个扩展方法,当它不包含在 java 脚本标签中时可以使用。

public static class ExtensionMethods
{
    public static string TickWrap(this HtmlHelper source, MvcHtmlString mvcHtmlString)
    {
        return "'" + mvcHtmlString.ToHtmlString().Replace("'", "''") + "'";
    }
}

在我看来用法如下

@Html.TickWrap(Html.DisplayNameFor(m => Model.SampleDateTime))

它所做的只是获取下面列出的数据注释的显示名称属性,并将其显示为“日期和时间”,并在其周围加上刻度。

[Display(Name = "Date and Time")]
public DateTime SampleDateTime {get; set;}

但是,我似乎无法让它在脚本标签中工作。我收到一个 JavaScript 严重错误语法错误。以下是包含在我的视图中的脚本。

<script type="text/javascript">
    $(function () {
        var displayName = @Html.TickWrap(Html.DisplayNameFor(m => Model.SampleDateTime))
        alert(displayName);
    });
</script>

我猜这与脚本部分中 HtmlHelper 的使用有关?如果是这样,我该如何在脚本部分使用?

这是我所做工作的简化版本,但我真正想做的是填充 jqGrid 的 colNames,而不必在 javascript 中对它们进行硬编码。我想使用数据注释,所以我只需要在一个地方进行更改。 jqGrid 的 colNames 被定义为

colNames: ['ParameterId','Location', 'Parameter Name', 'Date and Time', 'Parameter Value']

【问题讨论】:

  • 你试过把''(引号)放在@Html.TickWrap(Html.DisplayNameFor(m =&gt; Model.SampleDateTime))周围吗?
  • 这就是我的扩展方法@Html.TickWrap 的用途......它使用“我的自定义显示名称”包装了由数据注释指定的显示名称属性
  • 我认为我的问题与 @Html 在脚本标签中的使用方式有关,而不是 html 的正常渲染,但我不确定。我对 MVC 很陌生
  • 我发现大多数时候当我在 javascript 中使用 MVC @commands 时,它们必须用引号括起来。试试看,如果它起作用了,我不会感到惊讶。如果是这样,我会提出一个正式的答案。
  • 是的,手动单个刻度有效 var displayName = '@Html.DisplayNameFor(m => Model.SampleDateTime)' 但这引出了一个问题,即如何使其与包含刻度的 HtmlHelper 扩展一起工作''...我想我不确定这是否重要...但我会在早上尝试设置 colNames,就像我用这种方法所说的那样。

标签: jquery asp.net-mvc-4 jqgrid data-annotations


【解决方案1】:

在@Html.TickWrap(Html.DisplayNameFor(m => Model.SampleDateTime)) 周围加上''(引号)

【讨论】:

  • 我接受了答案,因为它让我朝着正确的方向前进。无论出于何种原因,HtmlHelper 代码在脚本标记中都需要用引号引起来。我什至不需要 TickWrap 扩展方法。
  • 最后,我使用以下 colNames 为 jqGrid 填充了数据注释中的元数据: [ '@Html.DisplayNameFor(m => headerMetadata.ParameterId)', '@Html. DisplayNameFor(m => headerMetadata.Location.DisplayName)'、'@Html.DisplayNameFor(m => headerMetadata.Parameter.DisplayName)'、'@Html.DisplayNameFor(m => headerMetadata.SampleDateTime)'、'@Html.DisplayNameFor (m => headerMetadata.ParameterValue1)' ],
  • @Dan P 我不确定你是否真的接受了它,它被赞成但没有被接受为答案。
【解决方案2】:

如果您想使用数据注释,您应该创建从属性类扩展的类。然后使用 PropertyInfo 反射获取值。

如果您想使用数据注释填充 jqGrid 的 colNames,我已经升级了我的 jq.grid 插件以支持数据注释,请查看 jq.grid 了解更多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多