在 2 个控制器之间传递 ID ASP.NET Core 3.1 MVC
Pass ID between 2 controllers ASP.NET Core 3.1 MVC
我是编程新手,需要您的帮助。我正在尝试创建一个简单的测试应用程序 (ASP.NET Core 3.1 MVC + EF)。我创建了 2 个模型(事件、注册)。目标是通过单击 Events/Index
页面中的“注册”按钮打开包含所选 EventId
的注册创建表单页面。我应该如何将 EventId
传递给 EnrollmentsController
?我尝试使用带有隐藏输入的表单在 Events/Index
页面中传递 EventId
,但我仍然不知道如何在 EnrollmentsController
.[=30 中正确处理 EventId
=]
注意:我不想在 Enrollment
的 Create
方法和视图中使用 SelectList
。
如有任何帮助,我将不胜感激。谢谢!
更新:感谢@PanagiotisKanavos,我终于在 URL 中获得了 EventId,但它仍然没有输入表单。有“0”。有什么问题吗?
型号
public class Event
{
public int EventId { get; set; }
public string Name { get; set; }
[DataType(DataType.Date)]
public DateTime Date { get; set; }
}
public class Enrollment
{
public int EnrollmentId { get; set; }
public int EventId { get; set; }
public Event Event { get; set; }
[Display(Name ="First name")]
public string FirstName { get; set; }
[Display(Name = "Last name")]
public string LastName { get; set; }
[Display(Name ="Enrollment date")]
[DataType(DataType.DateTime)]
public DateTime EnrollmentDate { get; set; }
}
Events/Index
查看
@model IEnumerable<FormTest.Models.Event>
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Date)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Date)
</td>
<td>
<a asp-action="Create" asp-controller="Enrollments" asp-route-id="@item.EventId" class="btn btn-primary">Enroll</a>
</td>
</tr>
}
</tbody>
</table>
Enrollments/Create
查看
@model FormTest.Models.Enrollment
@{
ViewData["Title"] = "Create";
}
<h1>Create</h1>
<h4>Enrollment</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="EventId" class="control-label"></label>
<input class="form-control" asp-for="EventId" name="EventId" />
</div>
<div class="form-group">
<label asp-for="FirstName" class="control-label"></label>
<input asp-for="FirstName" class="form-control" />
<span asp-validation-for="FirstName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="LastName" class="control-label"></label>
<input asp-for="LastName" class="form-control" />
<span asp-validation-for="LastName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="EnrollmentDate" class="control-label"></label>
<input asp-for="EnrollmentDate" class="form-control" />
<span asp-validation-for="EnrollmentDate" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
</div>
</div>
EnrollmentsController
创建方法
// GET: Enrollments/Create
public IActionResult Create(int eventId)
{
var newEnrollment = new Enrollment
{
EventId = eventId,
FirstName = "John",
LastName = "Doe",
EnrollmentDate = DateTime.UtcNow
};
return View(newEnrollment);
}
这是屏幕:
如果要使用asp-route-{value},需要确保值名称与action.Fo示例中的参数名称一致,您使用
public IActionResult Create(int eventId)
所以你需要使用
asp-route-eventId="@item.EventId"
最简单的选择是不使用表单,而是link注册控制器。毕竟,目标是打开 Enrollments
页面,而不是提交注册:
<td>
<a asp-controller="Enrollments"
asp-action="Create"
asp-route-id="@item.EventID">Enroll</a>
</td>
可以使 link 看起来像具有适当 Bootstrap 样式的按钮:
<a asp-controller="Enrollments"
asp-action="Create"
asp-route-id="@item.EventID"
class="btn btn-primary" role="button" >
Enroll
</a>
控制器动作需要接受id
作为参数:
public IActionResult Create(int eventId)
{
var newEnrollment=new Enrollment{
EventId=eventId,
...
};
return View(newEnrollment);
}
可以使用相同的路由标签助手in a form :
<td>
<form asp-controller="Enrollments"
asp-action="Create"
asp-route-id="@item.EventID" method="post">
<button type="submit" value="Enroll"></button>
</form>
</td>
虽然使用这样的表格有点奇怪。这将需要添加响应 POST
的 Index(id)
操作以及响应 GET
.
的 Index(id)
ASP.NET Core MVC Tutorial 展示了如何创建列出待办事项的应用程序,允许编辑、删除和从列表重定向到编辑页面。
Tag Helpers in Forms 页面解释了如何使用 asp-controller
、asp-action
和 asp-route-*
等标签助手来指定表单中的控制器、操作和参数。
我是编程新手,需要您的帮助。我正在尝试创建一个简单的测试应用程序 (ASP.NET Core 3.1 MVC + EF)。我创建了 2 个模型(事件、注册)。目标是通过单击 Events/Index
页面中的“注册”按钮打开包含所选 EventId
的注册创建表单页面。我应该如何将 EventId
传递给 EnrollmentsController
?我尝试使用带有隐藏输入的表单在 Events/Index
页面中传递 EventId
,但我仍然不知道如何在 EnrollmentsController
.[=30 中正确处理 EventId
=]
注意:我不想在 Enrollment
的 Create
方法和视图中使用 SelectList
。
如有任何帮助,我将不胜感激。谢谢!
更新:感谢@PanagiotisKanavos,我终于在 URL 中获得了 EventId,但它仍然没有输入表单。有“0”。有什么问题吗?
型号
public class Event
{
public int EventId { get; set; }
public string Name { get; set; }
[DataType(DataType.Date)]
public DateTime Date { get; set; }
}
public class Enrollment
{
public int EnrollmentId { get; set; }
public int EventId { get; set; }
public Event Event { get; set; }
[Display(Name ="First name")]
public string FirstName { get; set; }
[Display(Name = "Last name")]
public string LastName { get; set; }
[Display(Name ="Enrollment date")]
[DataType(DataType.DateTime)]
public DateTime EnrollmentDate { get; set; }
}
Events/Index
查看
@model IEnumerable<FormTest.Models.Event>
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Date)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Date)
</td>
<td>
<a asp-action="Create" asp-controller="Enrollments" asp-route-id="@item.EventId" class="btn btn-primary">Enroll</a>
</td>
</tr>
}
</tbody>
</table>
Enrollments/Create
查看
@model FormTest.Models.Enrollment
@{
ViewData["Title"] = "Create";
}
<h1>Create</h1>
<h4>Enrollment</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="EventId" class="control-label"></label>
<input class="form-control" asp-for="EventId" name="EventId" />
</div>
<div class="form-group">
<label asp-for="FirstName" class="control-label"></label>
<input asp-for="FirstName" class="form-control" />
<span asp-validation-for="FirstName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="LastName" class="control-label"></label>
<input asp-for="LastName" class="form-control" />
<span asp-validation-for="LastName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="EnrollmentDate" class="control-label"></label>
<input asp-for="EnrollmentDate" class="form-control" />
<span asp-validation-for="EnrollmentDate" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
</div>
</div>
EnrollmentsController
创建方法
// GET: Enrollments/Create
public IActionResult Create(int eventId)
{
var newEnrollment = new Enrollment
{
EventId = eventId,
FirstName = "John",
LastName = "Doe",
EnrollmentDate = DateTime.UtcNow
};
return View(newEnrollment);
}
这是屏幕:
如果要使用asp-route-{value},需要确保值名称与action.Fo示例中的参数名称一致,您使用
public IActionResult Create(int eventId)
所以你需要使用
asp-route-eventId="@item.EventId"
最简单的选择是不使用表单,而是link注册控制器。毕竟,目标是打开 Enrollments
页面,而不是提交注册:
<td>
<a asp-controller="Enrollments"
asp-action="Create"
asp-route-id="@item.EventID">Enroll</a>
</td>
可以使 link 看起来像具有适当 Bootstrap 样式的按钮:
<a asp-controller="Enrollments"
asp-action="Create"
asp-route-id="@item.EventID"
class="btn btn-primary" role="button" >
Enroll
</a>
控制器动作需要接受id
作为参数:
public IActionResult Create(int eventId)
{
var newEnrollment=new Enrollment{
EventId=eventId,
...
};
return View(newEnrollment);
}
可以使用相同的路由标签助手in a form :
<td>
<form asp-controller="Enrollments"
asp-action="Create"
asp-route-id="@item.EventID" method="post">
<button type="submit" value="Enroll"></button>
</form>
</td>
虽然使用这样的表格有点奇怪。这将需要添加响应 POST
的 Index(id)
操作以及响应 GET
.
Index(id)
ASP.NET Core MVC Tutorial 展示了如何创建列出待办事项的应用程序,允许编辑、删除和从列表重定向到编辑页面。
Tag Helpers in Forms 页面解释了如何使用 asp-controller
、asp-action
和 asp-route-*
等标签助手来指定表单中的控制器、操作和参数。