簡體   English   中英

如何使用剃刀頁面在 ASP.Net Core 上將對象從一個頁面傳遞到另一個頁面?

[英]How pass objects from one page to another on ASP.Net Core with razor pages?

我正在使用帶有剃刀頁面的 Asp.net core 2.0 開發 Web 應用程序。 我正在使用一些數據創建一個對象,並希望將該對象發送到另一個頁面。

其實我是這樣做的:

var customObject = new{
   //some values
};
return RedirectToPage("NewPage", customObject);

我看到 url 具有我正在發送的對象的值,但我找不到如何獲取這些值(在 NewPage 實例中)。

有人知道如何在剃刀頁面之間共享對象嗎? 這是實現它的正確方法嗎? 或者還有其他更好的方法嗎?

提前致謝

您可以將參數傳遞給頁面模型類中的指定處理程序,如下所示:

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 });

如果您只傳遞沒有匿名對象的數字,它將不起作用。

通過 Anchor Tag Helper 將對象從一個頁面傳遞到另一個頁面。

  1. 模型類。

     public class Car { public int ID { get; set; } public string Name { get; set; } public string Model { get; set; } public string Description { get; set; } }
  2. 汽車 - 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" } }; }
  3. 汽車 - 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>
  4. 詳細信息 - 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(); } }
  5. 詳細信息 - 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>

您可以使用 TempData 裝飾器。 它可用作裝飾器或字典,其目的是在請求之間保留一個對象。 在后台,值存儲在 cookie 或用戶會話中,由您選擇。 您可以在以下鏈接中查看有關其使用的更多詳細信息:

Microsoft 文檔中的 TempData
Learn Razor Pages 中的 TempData (更實用)

我不知道這是否對您有幫助,或者對於像 Razor 這樣的 MVVM 風格來說是一種很好的做法,但是在 ASP.NET Core API 項目中,我經常使用自定義的全局 DI 服務,例如

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddSingleton<IMyService, MyService>();

    ...

     services.AddMvc();
}

您可以在IndexModelCustomModel之間交換數據,例如。 通過將其設置為

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 Redirect("/Home/NewPage?id=" + customObject.Id);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM