【问题标题】:how to return model with index from IEnumerable<model> in mvc razor view?如何在 mvc razor 视图中从 IEnumerable<model> 返回具有索引的模型?
【发布时间】:2014-05-21 13:14:44
【问题描述】:

我在当前的 mvc razor 视图中有 IEnumerable,我想将选定的元素发送到子视图(弹出窗口)。 当前视图具有模型:@model IEnumerable&lt;warning&gt; 我想通过查询字符串将IEnumerable&lt;warning&gt;[index] 发送到子视图:

window.open("//WarningDetail?warning=" + IEnumerable<warning>[index], "_blank")

我的代码将显示一个网格面板列表和网格面板中的选定元素 将在新的弹出窗口中显示详细信息。所以这是主视图:

@model IEnumerable<WIS_3_0.Models.warning> 
warningGrid.Listeners.ItemDblClick.Fn = "selected";

@section JavaScript
{
   <script type="text/javascript" src="@Url.Content("/wis.js")"></script>
   <script>
       var selected = function (dv, record, item, index, e) {       
           window.open("/Examples/WarningDetail?warning=" + Model.ElementAt((int)index), "_blank", "left=100,top=100,width=400,height=300,toolbar=1,resizable=0");
          // Ext.Msg.alert(a);
       };
    </script>  
}

控制器:

[HttpGet]
        public ActionResult WarningDetail(warning warning)
        {

            return View(warning);
        }

和子视图(WarningDetail.cshtml):

@model WIS_3_0.Models.warning


@{
    ViewBag.Title = "WarningDetail";
}

<h2>WarningDetail</h2>
@if(@Model == null)
{
    <h4>null</h4>
}

最好的方法是什么?字符串查询是否与 javascript 函数 window.open 一起使用?在控制器中,对象警告始终为空!!!!

【问题讨论】:

    标签: javascript asp.net-mvc razor


    【解决方案1】:

    您将服务器端代码 (Model) 与客户端 JavaScript (index) 混合在一起。如果您需要在客户端导出结果并且在渲染标记/视图时无法确定 index 的值,则需要在服务器上渲染所有可能的值,然后在运行时使用 @ 从该列表中进行选择987654324@.

    类似这样的事情:

    <script>
        var warningValues = [];
    @foreach(var item in Model)
    {
        warningValues.push(@item);
    }
    
        var selected = function (dv, record, item, index, e) {       
            window.open("/Examples/WarningDetail?warning=" + warningValues[index],
                "_blank",
                "left=100,top=100,width=400,height=300,toolbar=1,resizable=0");
              // Ext.Msg.alert(a);
        };
    </script>  
    

    如果您的项目枚举很长,您可能应该重构代码以在服务器上做出决定,并避免将数据传递给客户端的开销。如果列表很短,这可能是一种不错的方法。

    【讨论】:

    • 看起来 warning 是一个类,所以 json 序列化器可能是个好主意。
    • 你在哪里得到这个错误?这是 Visual Studio 错误还是 JavaScript 错误?能否提供更多代码。
    • @OnurTOPAL,您可能会认为警告是一个类,但即使是这样,OP 也只针对单个字符串值,因此代码应该只需最少的修改即可工作。也就是说,这个问题似乎缺少很多信息。
    • OnurTOPAL 警告对象是一个定义为模型的类
    • @andleer 我在此行中遇到了 Visual Studio 2010 错误“当前上下文中不存在名称 'warningValues'”warningValues.push(@item);
    【解决方案2】:

    IEnumerable&lt;&gt; 没有索引属性。相反,您可以使用Model.ElementAt(index)。但是,如果您显示其余代码,可能会稍微容易一些。

    【讨论】:

    • 感谢 David,即使 Model.ElementAt(index) 仍然遇到同样的问题。我已将代码添加到我的问题中
    • index 是客户端变量。 @Modle.ElementAt() 是服务器端,所以这行不通。
    【解决方案3】:

    我认为这里的问题是您如何将警告参数呈现给 JS,基本上+ Model.... 处理为 JS 代码,您可以尝试以下一个。

    window.open("/Examples/WarningDetail?warning=@Model.ElementAt((int)index), "_blank", "left=100,top=100,width=400,height=300,toolbar=1,resizable=0");
    

    或其他一些解决方法来编写警告参数。

    【讨论】:

    • index 是客户端变量。 @Modle.ElementAt() 是服务器端,所以这行不通。
    • 哦,我错过了。所以这是你的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2023-03-15
    • 1970-01-01
    • 2012-01-28
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多