【问题标题】:Accessing C# variable from Javascript in asp.net mvc application在 asp.net mvc 应用程序中从 Javascript 访问 C# 变量
【发布时间】:2013-07-16 08:15:59
【问题描述】:

我在How to use javascript variables in C# and vise versa 中遇到问题:我将这个Model 传递给视图:

public List<Tache> Get_List_Tache()
{
    Equipe _equipe = new Equipe();
    List<Tache> liste_initiale = _equipe.Get_List_tache();
    return liste_initiale;
}

这是一个对象列表Tache,我想在其中使用它的三个字段Tache_descriptionBegin_dateEnd_date

在我的 JavaScript 代码中,我有这个功能,它工作正常:

       <script>

        $(document).ready(function () {
            var date = new Date();
            var d = date.getDate();
            var m = date.getMonth();
            var y = date.getFullYear();

            $('#calendar').fullCalendar({
                theme: true,
                header: {left: 'prev,next today',center: 'title',right: 'month,agendaWeek,agendaDay'},
                editable: true,
                events: [
                         @foreach (var m in Model.Get_List_Tache())
                          {
                        @:{title : @m.Tache_description , start: @m.Begin_date , end :  @m.Begin_date }
                          }
                        ]

                });
                                        });

</script>

数组events的值只是为了测试,我需要用Model的值填充events。对于这样的每个元素:title = Tache_descriptionstart = Begin_dateend = End_date

那么我该怎么做呢?有什么建议吗?

【问题讨论】:

  • 有没有什么办法可以返回 JSON 结果,并可能以这种方式调用数据?

标签: c# javascript .net asp.net-mvc razor


【解决方案1】:

在 javascript 中创建一个 foreach razor 循环:

var date = new Date();
var d = date.getDate();
var m = date.getMonth();
var y = date.getFullYear();
$('#calendar').fullCalendar({
    theme: true,
    header: {left: 'prev,next today',center: 'title',right: 'month,agendaWeek,agendaDay'},
    editable: true,
    events: [
    @
    {
      bool isFirst = true;
    }
    @foreach(var m in Model)
    {
        if(!isFirst)
        {
          @:,
        }

        @:{title: @m.Tache_description, ...<other properties here>}

        isFirst = false;
    }
    ]
});

【讨论】:

  • 但它表示@:{title: @m.Tache_description, start: @m.Begin_date, end : @m.Begin_date } 中的comma中的语法错误
  • 是的,您需要检查该项目是否是第一个,如果不是,首先在“{”之前添加一个逗号
  • 对不起,我不明白什么顺序?
  • 查看更新的答案,它有一个示例代码用于检查它
  • 你能把生成的javascript贴出来吗?
【解决方案2】:

试试这个,

foreach (var item in YourList)
{
    events: [{ title: '@item.title', start: '@item.start', end: '@item.end'}]
}

所以,在这段代码中,只需替换您的模型实体的名称。

【讨论】:

  • 但模型是 Tache(description,begin,end) 的列表
【解决方案3】:

对于标题,你可以做 title = "@Tache_description"

不确定 Begin_date 和 End_date 的格式/类型,您可能需要一些函数将日期读取为 javascript 格式。应该不会那么难。

遍历每个元素并将元素添加到事件数组中。有点像……

events = new Array()
@foreach(tache in list){
    item = { blah : blah, blah : blah };
    events.push(item);
}

对于此 c# 列表中的每个 c# 项,编写这些 javascript 行。您最终可能会得到一个很长的 javascript 代码块,但它应该可以解决问题。上面是伪代码。

【讨论】:

    【解决方案4】:

    补充 Darin 的回答:如果您需要外部 JavaScript 文件中的服务器端变量,请查看这篇博文:Generating External JavaScript Files Using Partial Razor Views

    【讨论】:

      【解决方案5】:

      1:如果您的模型需要Tache 列表,那么您拥有可以操作的整个列表。

      2:您可以通过调用您的操作Get_List_Tache(),使用 jquery ajax 作为 json 数据获取数据。

      【讨论】:

        【解决方案6】:

        假设此 javascript 在您的页面中是内联的,您可以执行以下操作:

        @model IList<Tache>
        <script type="text/javascript">
            var events = @Html.Raw(Json.Encode(Model.Select(x => new { title = x.Description, start = x.Begin.ToString("o"), end = x.End.ToString("o") })));
        
            $('#calendar').fullCalendar({
                theme: true,
                header: { 
                    left: 'prev,next today',
                    center: 'title',
                    right: 'month,agendaWeek,agendaDay'
                },
                editable: true,
                events: events
            });
        </script>
        

        此示例假定您的 Tache 模型具有属性 DescriptionBeginEnd

        public class Tache
        {
            public string Description { get; set; }
            public DateTime Begin { get; set; }
            public DateTime End { get; set; }
        }
        

        如果此脚本位于单独的 javascript 文件中,您仍然可以在视图中设置全局 events 变量,稍后您的脚本将使用该变量。或者,您可以使用 AJAX 调用来获取此模型。

        【讨论】:

        • 我这里有个问题(x =&gt; new {:它不接受 lambda 表达式
        • 试着把它放在同一行。我已经更新了我的答案。还要确保您在 lambda 表达式中的 Tache 模型上使用了正确的属性名称。顺便说一句,如果 Visual Studio 用红色曲线强调这一点作为错误,你可以忽略它。 Visual Studio Intellisense 不够智能。运行您的应用程序,看看它是否有效。
        • 同样出现这个错误:CS1977: Can not use a lambda expression as an argument to a dynamically distributed free by first cast to delegate type or kind of expression tree operation
        • 这应该可以工作,除非您的代码与我在答案中显示的不同。您的视图是否被强输入到@model IList&lt;Tache&gt;。我希望你没有尝试使用一些 ViewBag 的东西。
        • 这个错误CS1977: Can not use a lambda expression as an argument to a dynamically distributed free by first cast to delegate type or kind of expression tree operation的原因是什么?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-18
        • 2011-08-20
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多