カミソリページでAsp.netコア2.0を使用してWebアプリケーションを開発しています。データを含むオブジェクトを作成していて、そのオブジェクトを別のページに送信したい。
実際に私はこれをやっています:
var customObject = new{
//some values
};
return RedirectToPage("NewPage", customObject);
Urlには送信しているオブジェクトの値が含まれていることがわかりますが、その値を(NewPageインスタンスで)取得する方法が見つかりません。
かみそりのページ間でオブジェクトを共有する方法を知っている人はいますか?これはそれを達成する正しい方法ですか?または別のより良い方法はありますか?
前もって感謝します
それがあなたに役立つのか、それともRazorのようなMVVMフレーバーの良いプラクティスなのかわかりませんが、ASP.NET Core APIプロジェクトの中で私はしばしばカスタムグローバルDI'edサービスを使用します
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSingleton<IMyService, MyService>();
...
services.AddMvc();
}
IndexModel
とCustomModel
の間でデータを交換できます。のように設定することにより
public class CustomModel : PageModel
{
public IMyService _myService;
public CustomModel(IMyService myService)
{
_myService = myService;
}
public async Task<IActionResult> OnPostAsync(...)
{
...
_myService.SetDataOrSometing(...);
...
return RedirectToPage();
}
}
のように取得します
public class IndexModel : PageModel
{
public IMyService _myService;
public IndexModel(IMyService myService)
{
_myService = myService;
}
public void OnGet()
{
var data = _myService.GetDataOrSomething();
}
}
ここから、ObserveableCollectionを使用してイベントを登録し、PageModelsに更新を取得することもできます。
私見これは、あるページから別のページにオブジェクトを渡す方法で、問題を明確に分離します。
次のように、ページモデルクラスの指定されたハンドラーにパラメーターを渡すことができます。
return RedirectToPage("Orders", "SingleOrder", new {orderId = order.Id});
ページモデルクラスメソッドのシグネチャは次のとおりです。
public void OnGetSingleOrder(int orderId)
オブジェクトを渡す場合は、オブジェクトを直接渡すことができますが、私の経験では、子オブジェクトは入力されません。
ここで重要なのは、Razorページで定義されたルーティング制約とプロパティ名が一致する匿名オブジェクトを渡す必要があるということです。
たとえば、Razorページでid
(オプション)ルーティング制約を定義する場合:
@page "{id?}"
特定のid
を渡すビューにリダイレクトするには、次のようにします。
return RedirectToPage("PageName", new { id = 3 });
現在のページにリダイレクトする(ただし、特定のid
を渡す)場合は、次のようにします。
return RedirectToPage(new { id = 3 });
匿名オブジェクトなしで番号を渡すだけでは機能しません。
アンカータグヘルパーを使用してオブジェクトをあるページから別のページに渡します。
モデルクラス。
public class Car
{
public int ID { get; set; }
public string Name { get; set; }
public string Model { get; set; }
public string Description { get; set; }
}
車-PageModel。
public class CarsModel : PageModel
{
public List<Car> Cars { get; private set; } = new List<Car> {
new Car{ ID = 1, Name = "Car1", Model = "M1", Description = "Some description" },
new Car{ ID = 2, Name = "Car2", Model = "M2", Description = "Some description" },
new Car{ ID = 3, Name = "Car3", Model = "M3", Description = "Some description" },
new Car{ ID = 4, Name = "Car4", Model = "M4", Description = "Some description" }
};
}
車-RazorPage(パスオブジェクトのソース)->リストからすべてのアイテム(この場合は車)を表示「CarsModel」の。 'Anchor Tag Helper'では、 'asp-all-route-data'属性を使用します。これは、文字列として辞書名で初期化されます(この例では 'dictCars')。
@page
@using Newtonsoft.Json
@model CarsModel
@{
ViewData["Title"] = "Cars";
}
<table>
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Cars[0].Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Cars[0].Model)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var car in Model.Cars)
{
Dictionary<string, string> dictCars =
new Dictionary<string, string> { { "passedObject", JsonConvert.SerializeObject(car) } };
<tr>
<td>
@Html.DisplayFor(modelItem => car.Name)
</td>
<td>
@Html.DisplayFor(modelItem => car.Model)
</td>
<td>
<a asp-page="./Details" asp-all-route-data="dictCars">Details</a>
</td>
</tr>
}
</tbody>
</table>
詳細-PageModel(パスオブジェクトの宛先).
public class DetailsModel : PageModel
{
public Car Car { get; set; }
public IActionResult OnGet(string passedObject)
{
Car = JsonConvert.DeserializeObject<Car>(passedObject);
if (Car == null)
{
return NotFound();
}
return Page();
}
}
詳細-RazorPage。
@page
@model DetailsModel
@{
ViewData["Title"] = "Car Details";
}
<h2>Details</h2>
<div>
<h4>Car</h4>
<hr />
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.Car.Name)
</dt>
<dd>
@Html.DisplayFor(model => model.Car.Name)
</dd>
<dt>
@Html.DisplayNameFor(model => model.Car.Model)
</dt>
<dd>
@Html.DisplayFor(model => model.Car.Model)
</dd>
<dt>
@Html.DisplayNameFor(model => model.Car.Description)
</dt>
<dd>
@Html.DisplayFor(model => model.Car.Description)
</dd>
</dl>
</div>