C# NETCore2MVC-为GET方法存储对象
我的索引页上有一个搜索表单,可以在外部数据库中搜索可用的房间和酒店。提交表单后,用户将被重定向到一个新页面,其中包含可用酒店的列表(房间将稍后提供) 提交表单后,将搜索参数放入单个字符串中,然后通过ModelManager将其传递给TcpConnectionManager类,其中该字符串序列化为json,并通过套接字发送到外部Java服务器。服务器对json进行反序列化,将字符串元素放在SQL查询中,SQL查询将检查数据库并返回所有可用对象。然后将这些hotel对象放在HotelList对象中,序列化为json,并通过套接字发送回TcpConnectionManager类 我最大的问题是在HotelController中实现GET方法。试图将HotelList对象存储在TcpConnectionManager类中,但GET方法始终返回空对象 到目前为止,我已经能够通过实现一个单例类TempHotelsStorage来实现我想要的功能,该类具有存储和检索HotelList对象的方法,但我最关心的是,在这种情况下,这是否是一种好的/正确的方法?如果没有,如何改进 HomeController.cs:C# NETCore2MVC-为GET方法存储对象,c#,api,asp.net-core,asp.net-core-mvc,asp.net-core-2.0,C#,Api,Asp.net Core,Asp.net Core Mvc,Asp.net Core 2.0,我的索引页上有一个搜索表单,可以在外部数据库中搜索可用的房间和酒店。提交表单后,用户将被重定向到一个新页面,其中包含可用酒店的列表(房间将稍后提供) 提交表单后,将搜索参数放入单个字符串中,然后通过ModelManager将其传递给TcpConnectionManager类,其中该字符串序列化为json,并通过套接字发送到外部Java服务器。服务器对json进行反序列化,将字符串元素放在SQL查询中,SQL查询将检查数据库并返回所有可用对象。然后将这些hotel对象放在HotelList对象中,
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 });
}
}
}
HotelController.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();
}
}
}
名称空间NETCoreWebApp.Controllers
{
[路线(“api/酒店”)]
[ApiController]
公共类酒店控制器:控制器
{
public TempHotelsStorage hotelsStorage=TempHotelsStorage.Instance;
[HttpGet]
公共行动结果获取()
{
返回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();
}
}
公共类TcpConnectionManager
{
public temphotelstorage hotelStorage=temphotelstorage.Instance;
公共无效GetAvailableRooms(字符串查询)
{
//将json发送到其他服务器
TcpClient clientSocket=新的TcpClient();
clientSocket.Connect(“127.0.0.1”,6767);
NetworkStream ns=clientSocket.GetStream();
字符串jsonRequest=query;
字符串jsonToSend=JsonConvert.SerializeObject(jsonRequest);
byte[]dataBytes=Encoding.UTF8.GetBytes(jsonToSend);
写入(数据字节,0,数据字节长度);
//从其他服务器接收json
字节[]缓冲区=新字节[clientSocket.ReceiveBufferSize];
int bytesRead=ns.Read(缓冲区,0,clientSocket.ReceiveBufferSize);
string DataReceived=Encoding.UTF8.GetString(缓冲区,2,字节读取);
HotelList HotelList=JsonConvert.DeserializeObject(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;
}
}
}
}
名称空间NETCoreWebApp.Models
{
公共类临时存储
{
私有静态只读TempHotelsStorage实例=新建TempHotelsStorage();
静态TempHotelsStorage(){}
私有TempHotelsStorage(){}
public HotelList HotelList{get;set;}=new HotelList();
公共酒店(酒店列表)
{
对于(int i=0;i
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>"
);
}
}
});
}
函数getData(){
$.ajax({
键入:“获取”,
url:uri,
cache:false,
数据类型:“json”,
成功:功能(数据){
常量hotelListContainer=$(“#hotelListContainer”);
对于(var i=0;i<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>
您可以省去一些麻烦,并允许依赖注入来处理服务的生命周期。通过声明服务的接口和实现,您可以在
Startup
类的ConfigureServices
方法中注册服务,例如:services.AddTransient()代码>
然后只需将所述服务添加为控制器的construtor参数。
另外,您的TempHotelsStorage
类在这里似乎有些多余。如果只返回JsonConvert.DeserializeObject(DataReceived),就可以完全避免使用它在GetAvailableRooms
方法中的code>。
一般来说,我还建议不要使用相同的方法管理连接和检索数据,但这可能超出了这个特定问题的重点
关于使用单例对象——您通常会在需要在应用程序的整个生命周期中持久化对象的情况下使用它们,例如,为了持久化某些状态。这里不是这样。遵循Marchyello的建议,使用依赖项注入,我首先在Startup类中注册了singleton服务:
services.AddSingleton<IModelManager, ModelManager>();
ModelManager类只是模型的一个门面,充当api控制器通过调用GET和POST方法存储和检索数据的访问点
家庭控制器:
[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);
_modelManager.SaveQuery(_query);
return RedirectToAction("Hotel");
}
[HttpGet]
public ActionResult<HotelList> Get()
{
return _modelManager.ReturnQuery();
}
酒店管理员:
[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);
_modelManager.SaveQuery(_query);
return RedirectToAction("Hotel");
}
[HttpGet]
public ActionResult<HotelList> Get()
{
return _modelManager.ReturnQuery();
}
ModelManager是单例的,因为在重定向到Hotel view之前,Hotel controller需要访问主控制器已将查询字符串存储到的ModelManager实例。此外,下一步将根据酒店选择列出可用房间,房间控制器的GET方法将需要访问与酒店控制器相同的HotelList对象 您的搜索结果(第w页