gpt4 book ai didi

c# - NET Core 2 MVC - 为 GET 方法存储对象

转载 作者:行者123 更新时间:2023-11-30 16:39:14 25 4
gpt4 key购买 nike

我的索引页上有一个搜索表单,用于在外部数据库中搜索可用的房间和酒店。提交表单后,用户将被重定向到一个包含可用酒店列表的新页面(房间稍后会出现)。

提交表单后,搜索参数被放入单个字符串中,然后通过 ModelManager 传递给 TcpConnectionManager 类,在此字符串被序列化为 json 并通过套接字发送到外部 Java 服务器。服务器反序列化 json,将字符串元素放入 SQL 查询中,后者依次检查数据库并返回所有可用的酒店对象。然后将这些酒店对象放置在 HotelList 对象中,序列化为 json 并通过套接字发送回 TcpConnectionManager 类。

我最大的问题是在 HotelController 中实现 GET 方法。尝试将 HotelList 对象存储在 TcpConnectionManager 类中,但 GET 方法始终返回空对象。

到目前为止,我已经能够通过实现单例类 TempHotelsStorage 来完成我想要的,它具有存储和检索 HotelList 对象的方法,但我最担心的是在这种情况下这是否是一种好的/正确的方法?如果不是,那么如何改进?

家庭 Controller .cs:

namespace NETCoreWebApp.Controllers
{
public class HomeController : Controller
{
private readonly IModelManager iModelManager = new ModelManager();

public IActionResult Index()
{
return View();
}

public IActionResult Hotel()
{
return View();
}

[HttpPost]
public IActionResult Index(SearchRoomsModel model)
{
string query = string.Format("{0},{1} 12:00,{2} 12:00,{3},{4}", model.Location, model.CheckIn, model.CheckOut, model.NumAdults, model.NumChild);

iModelManager.GetAvailableRooms(query);

return RedirectToAction("Hotel");
}

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}

酒店 Controller .cs:

namespace NETCoreWebApp.Controllers
{
[Route("api/hotel")]
[ApiController]
public class HotelController : Controller
{
public TempHotelsStorage hotelsStorage = TempHotelsStorage.Instance;

[HttpGet]
public ActionResult<HotelList> Get()
{
return hotelsStorage.GetHotelsFromStorage();
}
}
}

TcpConnectionManager.cs:

public class TcpConnectionManager
{
public TempHotelsStorage hotelStorage = TempHotelsStorage.Instance;

public void GetAvailableRooms(string query)
{
//Sending json to other server

TcpClient clientSocket = new TcpClient();

clientSocket.Connect("127.0.0.1", 6767);

NetworkStream ns = clientSocket.GetStream();

string jsonRequest = query;

string jsonToSend = JsonConvert.SerializeObject(jsonRequest);

byte[] dataBytes = Encoding.UTF8.GetBytes(jsonToSend);

ns.Write(dataBytes, 0, dataBytes.Length);

//Receiving json from other server

byte[] buffer = new byte[clientSocket.ReceiveBufferSize];

int bytesRead = ns.Read(buffer, 0, clientSocket.ReceiveBufferSize);

string DataReceived = Encoding.UTF8.GetString(buffer, 2, bytesRead);

HotelList hotelList = JsonConvert.DeserializeObject<HotelList>(DataReceived);

hotelStorage.SaveHotels(hotelList);

clientSocket.Close();
ns.Close();
}
}

TempHotelsStorage.cs:

namespace NETCoreWebApp.Models
{
public class TempHotelsStorage
{
private static readonly TempHotelsStorage instance = new TempHotelsStorage();

static TempHotelsStorage() { }
private TempHotelsStorage() { }

public HotelList hotelList { get; set; } = new HotelList();

public void SaveHotels(HotelList hList)
{
for (int i = 0; i < hList.Size(); i++)
{
hotelList.AddHotel(hList.GetHotelByIndex(i));
}
}

public HotelList GetHotelsFromStorage()
{
return hotelList;
}

public static TempHotelsStorage Instance
{
get
{
return instance;
}
}
}
}

jQuery 列出所有酒店:

function getData() {
$.ajax({
type: "GET",
url: uri,
cache: false,
dataType: 'json',
success: function (data) {

const hotelListContainer = $('#hotelListContainer');

for (var i = 0; i < data.hotelList.length; i++)
{
hotelListContainer
.append(
"<div class='col-md-12' id='hotelListItem'>" +
"<div class='col-md-3' id='hotelItemPicture'>ID:" + data.hotelList[i].hid + "</div>" +
"<div class='col-md-9' id='hotelItemDescription'>NAME:" + data.hotelList[i].name + "</div>" +
"</div>"
);
}
}
});
}

HTML 标记:

<div class="container-fluid" id="hotelListArea">
<div class="row">
<div class="col-md-2"></div>
<div class="col-md-8" id="centerHotelListArea">
<div id="hotelListContainer">
<div id="hotelContainerItem"></div>
</div>
</div>
<div class="col-md-2"></div>
</div>

最佳答案

您可以让自己省去一些麻烦,并允许依赖注入(inject)来处理服务的生命周期。您可以在 ConfigureServices 中注册服务你的方法 Startup通过声明其接口(interface)和实现来类,例如:
services.AddTransient<ITcpConnectionManager, TcpConnectionManager>();
然后只需将所述服务添加为 Controller 的构造函数参数即可。
还有你的TempHotelsStorage类在这里似乎有些多余。如果你只是return JsonConvert.DeserializeObject<HotelList>(DataReceived);,你可以完全避免使用它在你的GetAvailableRooms方法。一般来说,我也建议不要使用相同的方法管理连接和检索数据,但这可能超出了这个特定问题的重点。

关于使用单例对象——您通常会在需要在应用程序的整个生命周期中持久保存一个对象的情况下使用它们,例如持久保存某些状态。这里不是这种情况。

关于c# - NET Core 2 MVC - 为 GET 方法存储对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53402394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com