【问题标题】:Passing of model from razor to javascript - very strange error将模型从剃刀传递到 javascript - 非常奇怪的错误
【发布时间】:2019-12-04 18:45:58
【问题描述】:

我尝试将 HTML 表格行中的选定模型直接传递给 javascript 函数,包括转换为 JSON。由于以下问题,转换失败。
此外,我吓坏了 6 个多小时,试图了解它为什么不起作用。现在我知道是什么导致了问题,不知道如何解决它。 这是我尝试过的(简单易行):

<table class="table table-hover">
<thead align="center">
    <tr>
        <th scope="col">AssetID</th>
        <th scope="col">Loaction</th>
        <th scope="col">AreaIn</th>
        <th scope="col">Rooms</th>
        <th scope="col">ImageURL</th>
        <th scope="col">Action</th>

    </tr>
</thead>
<tbody align="center">

    @foreach (var a in @Model.OwnAssetsList)
    {

        String[]  assetArray = new String[8] { a.AssetID.ToString(), a.OwnerID.ToString(), a.OwnerPublicKey.ToString(), a.Loaction.ToString(), a.AreaIn.ToString(), a.Rooms.ToString(), a.ImageURL.ToString(), a.Price.ToString() };
        <tr>
            <td>@a.AssetID</td>
            <td>@a.Loaction</td>
            <td>@a.AreaIn</td>
            <td>@a.Rooms</td>
            <td><a target="_blank" href=@a.ImageURL>Click</a></td>
            <td><button class="btn btn-primary" data-toggle="modal" data-target="#exampleModalLong" onclick="offerContract(@a.Loaction/* or @a.ImageURL*/)">Offer Contract</button></td>

        </tr>
    }
</tbody>

在 Javascript 中:

@section scripts
{
<script type="text/javascript">
    function offerContract(param)
    {    
        document.getElementById("dialogAssetID").innerHTML = "Asset No:".bold()+param.AssetID;
        document.getElementById("dialogOwnerAddress").innerHTML="Your Public Key:" +param.OwnerID;
  }               
</script>
}

当且仅当我传递@a.Loaction 或@a.ImageURL 时,javascript 函数才会失败。 这是控制台中的错误:'Uncaught SyntaxError: missing ) after argument list'。

模型的其余属性成功通过。 '@a.Loaction' 和 '@a.ImageURL' 在 HTML 表中工作正常 我现在添加模型和表格方案:

public class Asset
{
    [Key]
    public int AssetID { get; set; }

    [Required]
    public int OwnerID { get; set; }

    [Required]
    public string OwnerPublicKey { get; set; }

    [Required]
    public string Loaction { get; set; }

    [Required]
    public int AreaIn { get; set; }

    [Required]
    public int Rooms { get; set; }

    [Required]
    public string ImageURL { get; set; }

    [Required]
    public double Price { get; set; }
    }

我将不胜感激。在这个问题上花费了超过 6 个小时。

【问题讨论】:

    标签: javascript sql-server entity-framework razor nvarchar


    【解决方案1】:

    在您的 Razor 页面中,您基本上需要预先生成一个 javascript 对象,然后将其传递给您的 JS:

    在你的脚本部分是个好地方:

    @section scripts {
        <script type="text/javascript">
            var data = @Json.Serialize(@Model.OwnAssetsList);
            function offerContract(index)
            {           
                document.getElementById("dialogAssetID").innerHTML = "Asset No:".bold() + data[index].assetId;
                document.getElementById("dialogOwnerAddress").innerHTML="Your Public Key:" + data[index].ownerId;
            }
        </script>
    

    然后你的 Razor 可能看起来像这样(注意,由于你选择 foreach,没有直接的方法来获取当前的迭代索引,所以我必须自己介绍一个):

    @{var i = 0} //
    @foreach (var a in @Model.OwnAssetsList)
    {
        <tr>
            ...
            <td><button class="btn btn-primary" data-toggle="modal" data-target="#exampleModalLong" onclick="offerContract(@i)">Offer Contract</button></td>         
        </tr>
        i += 1; // next iteration
    }
    }
    

    UPD:如果您绝对必须将字符串从 Razor 传递给 JS,则需要引用它们:

    <td><button class="btn btn-primary" data-toggle="modal" data-target="#exampleModalLong" onclick="offerContract('@a.Loaction')">Offer Contract</button></td>
    

    我建议使用单引号,以免 Razor 感到困惑

    【讨论】:

    • 很抱歉,我假设您在 asp.net 4.x 上运行项目。那你的环境是什么?
    • 我猜是 Asp.net 4.5
    • 我在 VS2019 上使用 mvc core 3.0
    • @Json.Serialize() 在 ASP.NET Core 中可用,它的作用相同。我更新了答案
    • 函数无法识别
    【解决方案2】:

    我找到了另一种传递有问题的属性的方法:

    <tbody align="center">
        @{ int i = 0;}
        @foreach (var a in @Model.OwnAssetsList)
        {
            string loaction = "loc" + i;
            string url = "url" + i;
    
            <tr>
                <td>@a.AssetID</td>
                <td id=@loaction>@a.Loaction</td>
                <td>@a.AreaIn</td>
                <td>@a.Rooms</td>
                <td><a id=@url target="_blank" href=@a.ImageURL>Click</a></td>
                <td><button class="btn btn-primary" data-toggle="modal" data-target="#exampleModalLong" onclick="offerContract( @i)">Offer Contract</button></td>
            </tr>
            i++;
        }
    
    </tbody>
    

    并在函数中:

     function offerContract(param)
        {        
            var idLoac = "#loc" + param;
            var idUrl = "#url" + param;
            var demdloc = $(idLoac).text();
            var demdurl = $(idUrl).attr("href");
            document.getElementById("dialogAssetID").innerHTML = "Asset No:".bold() + demdloc;
            document.getElementById("dialogOwnerID").innerHTML = "Your ID:".bold() + demdurl;
        }
    

    而且属性完全通过了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多