如何使用剃刀页面在ASP.Net Core上将对象从一个页面传递到另一个页面?

问题描述 投票:5回答:4

我正在使用带有剃刀页面的Asp.net核心2.0开发Web应用程序。我正在创建一个包含一些数据的对象,并希望将该对象发送到另一个页面。

其实我这样做:

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

我看到url具有我正在发送的对象的值,但我找不到如何获取该值(在NewPage实例中)。

谁能知道如何在剃刀页面之间共享对象?这是实现它的正确方法吗?还是有另一种更好的方法吗?

提前致谢

c# razor asp.net-core
4个回答
1
投票

我不知道这对你是否有帮助,或者对于像Razor这样的MVVM风格是一个好习惯,但在ASP.NET Core API项目中,我经常使用自定义全局DI'ed服务,比如

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并注册事件以将更新下载到您的PageModel。

恕我直言,这是一种将对象从一个页面传递到另一个页面的方法,可以清晰地分离关注点。


20
投票

您可以将参数传递给页面模型类中的指定处理程序,如下所示:

return RedirectToPage("Orders", "SingleOrder", new {orderId = order.Id});

页面模型类方法具有此签名的位置:

public void OnGetSingleOrder(int orderId)

如果要传递对象,则可以直接传递对象,但根据我的经验,不会填充任何子对象。


3
投票

这里的关键是你需要传递一个匿名对象,其属性名称与Razor页面中定义的路由约束相匹配。

例如,如果在Razor页面中定义id(可选)路由约束:

@page "{id?}"

要重定向到通过特定id的视图,只需执行以下操作:

return RedirectToPage("PageName", new { id = 3 });

如果你只是一个重定向到当前页面(但传递一个特定的id),只需:

return RedirectToPage(new { id = 3 });

如果您只传递没有匿名对象的数字,它将无法工作。


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(pass-object的目标)。 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>
© www.soinside.com 2019 - 2024. All rights reserved.