Во-первых, я учу себя ASP.NET MVC, используя ASP.NET Core 2.1 с EF Core 2.1, так что я довольно схож с этим.
Я пытаюсь изменить представление просмотра, чтобы принять необязательный параметр для ClientID.Идея состоит в том, чтобы разрешить выбор из всех клиентов, если идентификатор не указан, но, если он указан, принудительно заставить ввод данных для клиента к указанному значению.
У меня возникли проблемы с получением GET для распознавания наличия параметра,если параметр конкретно не int? id
.Если я изменяю его на это, то при отправке в POST возникает исключение для дублирующего идентификатора.
Все контроллеры и представления были очищены, только показанный метод GET был изменен.
КонтроллерСоздать метод GET:
// GET: ServiceRequest/Create/1
public IActionResult Create(int? clientId)
{
ViewData["ClientData"] = new SelectList(_context.Clients, "ID", "FullName");
if (clientId != null ) {
if (_context.Clients.Find(clientId) == null) {
return NotFound();
}
ViewData["ClientID"] = clientId;
ViewData["ClientName"] = _context.Clients.Find(clientId).FullName;
}
ServiceRequest request = new ServiceRequest();
request.Deadline = DateTime.Today;
request.Status = Models.Status.DRAFT;
return View(request);
}
Создать представление:
@model AskewServices.Models.ServiceRequest
@{
ViewData["Title"] = "Open Service Request";
}
<h2>@ViewData["Title"]</h2>
<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="Deadline" class="control-label"> </label>
<input asp-for="Deadline" class="form-control" />
<span asp-validation-for="Deadline" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Status" class="control-label"></label>
<select disabled asp-for="Status" class="form-control">
<option value=@AskewServices.Models.Status.DRAFT>Draft</option>
</select>
<span asp-validation-for="Status" class="text-danger"></span>
</div>
<div class="form-group">
<label class="control-label">Client</label>
@if (ViewData.ContainsKey("ClientID")) {
<select disabled asp-for="ClientID" class="form-control">
<option value=@ViewData["ClientID"]>@ViewData["ClientName"]</option>
</select>
} else {
<select asp-for="ClientID" class="form-control" asp-items="ViewBag.ClientData"></select>
}
</div>
<div class="form-group">
<input type="submit" value="Open" class="btn btn-warning" />
<input type="reset" value="Reset" class="btn btn-info" />
</div>
</form>
</div>
</div>
Маршруты:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "OpenServiceRequest",
template: "{controller=ServiceRequest}/{action=Create}/{clientId?}");
});
Мысли: Параметры заданы неверно или проблема сМаршрутизация (возможно, он не видит маршрут создания ServiceRequest)?