我正在使用带有剃刀页面的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并注册事件以将更新下载到您的PageModel。
恕我直言,这是一种将对象从一个页面传递到另一个页面的方法,可以清晰地分离关注点。
您可以将参数传递给页面模型类中的指定处理程序,如下所示:
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将对象从一个页面传递到另一个页面。
public class Car
{
public int ID { get; set; }
public string Name { get; set; }
public string Model { get; set; }
public string Description { get; set; }
}
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" }
};
}
@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>
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();
}
}
@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>