Отправить форму и сделать действие контроллера из ViewComponent в ASP.NET Керн
Я хочу добавить ListItems из формы в ViewComponent в ASP.NET 5, применение сердечника Mvc.
представление компонента (представленияSharedComponentsAddListItemDefault.cshtml) на:
@model ShoppingList.Models.ListItem
<form asp-action="Create">
<div class="form-horizontal">
<hr />
<div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div>
<!-- some fields omitted for brevity -->
<div class="form-group">
<label asp-for="Description" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="Description" class="form-control" />
<span asp-validation-for="Description" class="text-danger" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
</form>
контроллер ViewComponent (ViewComponentsAddListItem.cs):
namespace ShoppingList.ViewComponents
{
public class AddListItem : ViewComponent
{
private readonly ApplicationDbContext _context;
public AddListItem(ApplicationDbContext context)
{
_context = context;
}
public IViewComponentResult Invoke(string listId)
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IViewComponentResult> Create (ListItem listItem)
{
_context.ListItem.Add(listItem);
await _context.SaveChangesAsync();
return View(listItem);
}
}
}
компонент вызывается в home.cshtml по:
@{
ViewData["Title"] = "Home Page";
}
@Component.Invoke("AddListItem", @ViewBag.DefaultListId)
однако я не могу заставить это работать. Ничего не добавляется.
2 ответов
переименовать AddListItem
до AddListItemViewComponent
. Это соглашение, которое используется ASP.NET чтобы найти компонент-то есть ViewComponents, нужно закончить с ViewComponent
суффиксом. Если вы не хотите делать это таким образом, вы можете украсить класс [ViewComponent]
атрибут и установите свойство name в любое имя, которое вам требуется.
и Create
метод никогда не будет вызываться и ViewComponents никогда не будет отвечать на HttPost
потому что единственная цель-отображать вид, а не выполнить код в ответ на обратную передачу. В представлении будет только вызов Invoke
или его асинхронная версия InvokeAsync
и больше ничего.
это немного запутанно сначала, но простой способ думать об этом, как мощный Partial
в том смысле, что вы можете делать больше вещей в компонент класс, Ди дружелюбный, и легче проверить также.
ASP.NET команда имеет страницу, которая объясняет ViewComponents здесь
Спасибо за вашу помощь, @Dealdiane.
в случае, если кто-то интересовался, вот рабочий код:
Views\Shared\Components\AddListItem\Default.cshtml по
<form asp-controller="ListItems" asp-action="QuickCreate">
<div class="form-horizontal">
<hr />
<div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="No" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="No" class="form-control" />
<span asp-validation-for="No" class="text-danger" />
</div>
</div>
...
Контроллеры\ListItemsController.cs
// POST: ListItems/QuickCreate
// Create item without showing view, return to home
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> QuickCreate(ListItem listItem)
{
_context.ListItem.Add(listItem);
await _context.SaveChangesAsync();
return Redirect("/");
}
полный исходный код проекта в работе можно найти здесь:GitHub ShoppingList