You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC中View页面Guid传递为空问题求助

问题:Guid主键从搜索页传递到编辑页为空值的解决方法

我有一张名为Shipment的表,主键(PK)数据类型是uniqueidentifier(对应C#中的Guid)。我制作了一个查询Shipment数据的View页面,查询结果里的ActionLink可引导用户进入编辑页面查看并编辑数据。但点击链接时,从搜索页传递到编辑页的是空Guid(00000000-0000-0000-0000-000000000000),手动将主键复制粘贴到URL中时,文本框能正常显示对应列的数据。需要指导如何在View页面正确传递Guid并读取对应数据。


编辑页面控制器代码(更新控制器正常,未附上)

//get shipment info
public ActionResult Edit(Guid id)
{
    List<Shipment> shipments = new List<Shipment>();
    Shipment shipment = new Shipment();
    using (SqlConnection con = new SqlConnection(connectonString))
    {
        var query = "SELECT * FROM Shipments where sSUID = @SSuid";
        //var query = "SELECT * FROM Shipments where sSUID = '" + id + "'";

        SqlCommand cmd = new SqlCommand(query, con);
        cmd.Parameters.Add("@SSuid", SqlDbType.UniqueIdentifier).Value = id;
        con.Open();
        
        SqlDataReader dr = cmd.ExecuteReader();
        if (dr.Read())
        {
            shipment.SSuid = (Guid)dr["SSuid"];
            //shipment.SSuid = dr.GetGuid(dr.GetOrdinal("SSuid").ToString());
            shipment.SFrom = Convert.ToString(dr["SFrom"]);
            //shipment.SSuid = Guid.Parse(dr["SSuid"].ToString());
            //shipment.SSuid = (Guid).Parse(dr["SSuid"].ToString());
            //shipment.SSuid = (Guid)dr["SSuid"].ToString();
            shipment.SCompanyName = Convert.ToString(dr["SCompanyName"]);
            shipment.SFname = Convert.ToString(dr["SFname"]);
            shipment.SMname = Convert.ToString(dr["SMname"]);
            shipment.SLname = Convert.ToString(dr["SLname"]);
            shipment.SFrom = Convert.ToString(dr["SFrom"]);
            shipment.SAddress1 = Convert.ToString(dr["SAddress1"]);
            shipment.SAddress2 = Convert.ToString(dr["SAddress2"]);
            shipment.SCity = Convert.ToString(dr["SCity"]);
            shipment.SState = Convert.ToString(dr["SState"]);
            shipment.SPostalCode = Convert.ToString(dr["SPostalCode"]);
            shipment.SCountry = Convert.ToString(dr["SCountry"]);

            //shipments.Add(shipment);
        }

        con.Close();
    }

    return View(shipment);
}

搜索页传递Guid的ActionLink代码

@Html.ActionLink("Edit", "Edit", new {id=shipment.SSuid}) |
@*@Html.ActionLink("Edit", "Edit", new {id=shipment.SSuid.ToString()})*@ 

编辑页View代码

@model Receiving.Models.Shipment;
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@using (Html.BeginForm(new { @class = "form-horizontal" }))
{
    @Html.AntiForgeryToken()
    ;
<div class="form-row">
        @Html.HiddenFor(m => m.SSuid)
        @Html.TextBoxFor(m => m.SSuid, new { @class = "form-control", tabindex = 1 })

    </div>
}

更新:搜索控制器代码(问题根源)

发现是搜索控制器读取Guid时返回空值,但其他数据正常,以下是搜索函数代码:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SearchByTrackingNumber(string? TrackingNumber ) {
    List<Shipment> shipments = new List<Shipment>();
    using(SqlConnection con = new SqlConnection(connectonString))
    {
        con.Open();
        String sql = "select * from Shipments inner join Packages on Shipments.sSUID = Packages.pSUID where pTrackingNumber like'%" + TrackingNumber + "%' order by sDateReceived";
        SqlCommand cmd = new SqlCommand(sql, con);

        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                Shipment shipment = new Shipment();
                //shipment.SSuid = reader.GetGuid(reader.GetOrdinal("SSuid").ToString());
                //shipment.SSuid = Guid.Parse(reader["SSuid"]).ToString();
                Guid guid = new Guid(reader["SSuid"].ToString());//This is not working
                shipment.SCompanyName = Convert.ToString(reader["SCompanyName"]);
                shipment.SFname = Convert.ToString(reader["SFname"]);
                shipment.SMname = Convert.ToString(reader["SMname"]);
                shipment.SLname = Convert.ToString(reader["SLname"]);
                shipment.SFrom = Convert.ToString(reader["SFrom"]);
                shipment.SAddress1 = Convert.ToString(reader["SAddress1"]);
                shipment.SAddress2 = Convert.ToString(reader["SAddress2"]);
                shipment.SCity = Convert.ToString(reader["SCity"]);
                shipment.SState = Convert.ToString(reader["SState"]);                            
                shipment.SPostalCode = Convert.ToString(reader["SPostalCode"]);
                shipment.SCountry = Convert.ToString(reader["SCountry"]);
                
                shipments.Add(shipment);
            }
            con.Close();
        }
    }

    return View(shipments); 
}

解决方案

1. 修复Guid赋值逻辑

搜索控制器中,你创建了guid变量但并未赋值给shipment.SSuid,同时错误地将Guid转为字符串再解析,替换为直接读取Guid的方式:

// 替换原Guid读取代码
shipment.SSuid = reader.GetGuid(reader.GetOrdinal("SSuid"));

2. 修复SQL注入漏洞

原搜索SQL使用字符串拼接存在注入风险,改用参数化查询:

String sql = "select * from Shipments inner join Packages on Shipments.sSUID = Packages.pSUID where pTrackingNumber like @TrackingNumber order by sDateReceived";
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.Add("@TrackingNumber", SqlDbType.NVarChar).Value = "%" + TrackingNumber + "%";

3. 确认ActionLink传递逻辑

搜索页的ActionLink可直接传递Guid类型,保持原代码即可:

@Html.ActionLink("Edit", "Edit", new {id=shipment.SSuid})

完成以上修改后,搜索结果中的shipment.SSuid会被正确赋值,点击Edit链接时即可将有效Guid传递到编辑页面,编辑页就能正常读取对应数据。

内容的提问来源于stack exchange,提问作者smbbb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:49:51