У меня есть таблица с названием «Отгрузка», где ее тип данных PK является уникальным идентификатором (Guid в С#). Затем у меня есть страница просмотра для поиска данных о доставке, а в данных результатов есть ссылка ActionLink, которая направляет пользователя на страницу редактирования, где вы можете просмотреть и отредактируйте его. Проблема в том, что когда я нажимаю на ссылку, со страницы поиска на страницу редактирования передается только пустой Guid (00000000-0000-0000-0000-000000000000). Однако, если я вручную скопирую и вставлю PK в URL-адрес, столбцы будут идеально напечатаны в текстовых полях. Может ли кто-нибудь помочь мне правильно передать 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);
}
Вот часть ActionLink страницы поиска, которая передает Guid
@Html.ActionLink("Edit", "Edit", new {id=shipment.SSuid}) |
@*@Html.ActionLink("Edit", "Edit", new {id=shipment.SSuid.ToString()})*@
На странице редактирования в текстовом поле указано 00000000-0000-0000-0000-000000000000, а в URL-адресе /Shipment/Edit/00000000-0000-0000-0000-000000000000.
@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);
}
Я думаю, что это может быть проблемой, потому что ASP.NET MVC не знает, где находятся данные, которые ему нужно получить.
Вы можете добавить тег [HttpGet]
прямо над объявлением функции Edit, например:
[HttpGet]
public ActionResult Edit(Guid id) {
// do stuff
}
При этом единственное, что мне приходит в голову о том, почему это происходит, заключается в том, что вы отправляете SSuid в виде строки, а в строке запроса C# и ASP.NET не могут неявно преобразовать SSuid в объект Guid.
Таким образом, вы можете попробовать изменить тип параметра на строку следующим образом:
public ActionResult Edit(string id) {
// convert id to guid here
// then do stuff
}
Пожалуйста, дайте мне знать, если это работает. Спасибо
@smbbb Судя по вашему описанию, Guid в этот момент уже представляет собой длинную пустую строку. Я бы проверил, что такое Guid, когда он создается на странице поиска, он может быть пустым. Если там пусто, то есть проблема с отправкой гуида из контроллера в представление Shipment. Убедитесь, что это правильное значение и на этой странице.
Ох, ладно. Я только что добавил <td> и напечатал guid данных результата после поиска, и он печатает пустую строку... Итак, я должен изменить контроллер поиска, прежде чем даже проверять контроллер редактирования?
@smbbb да, похоже, проблема именно в этом.
Сможете ли вы взглянуть на мою функцию поиска, если я добавлю ее в пост?
Я только что добавил контроллер поиска. Было бы здорово, если бы вы могли видеть, что я упускаю!
@smbbb похоже, что вы на самом деле не устанавливаете его в объекте отгрузок. Например, вы создаете переменную с именем guid, но ничего не устанавливаете в параметре shipping.SSUID. Итак, вы создаете переменную, она не сохраняется в объекте, передаваемом в представление, а затем отображается как значение по умолчанию для guid.
Ты великолепен! Я вернулся и отладил, и он работает как шарм :) Большое спасибо!
Давайте продолжим обсуждение в чате.
Спасибо за ваш ответ. У меня все еще возникают проблемы с преобразованием id в guid. То, что у меня есть
cmd.Parameters.Add("@SSuid", SqlDbType.UniqueIdentifier).Value = id;
, не конвертируется?