#c_sharp #aspnet_mvc
@if (item.UserId == User.Identity.GetUserId().AsInt()) { using (Html.BeginForm("Delete", "Home", FormMethod.Post)) { @Html.AntiForgeryToken() @Html.HiddenFor(m => item.Id) } } Вот сам вид в html view [HttpPost] [Authorize] public ActionResult Delete(int Id) { var session = NHibernateHelper.GetCurrentSession(); try { using (var transaction = session.BeginTransaction()) { DBNewsItem newItem = new DBNewsItem(); newItem.Id = Id; session.Delete(newItem); transaction.Commit(); } } finally { NHibernateHelper.CloseSession(); } return RedirectToAction("Index", "Home"); } А вот контроллер, который должен принимать id. Почему ему ничего не приходит?
Ответы
Ответ 1
В случаях, если вы вызываете XXXFor не для свойства модели, а для какого-то стороннего объекта вы рендерите View через PartialFor или какой-то еще способ рендеринга сложного темплйта для поля. ... MVC выставляет ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix - в зависимости от имени переменной или от имени свойства в родительской модели. Делается это для того, чтобы поля для разных Partial Views получили гарантированно разные имена в HTML. Поэтому в HTML вы получаете не "id", а какой-нибудь "item_id". Для того, чтобы сбайндить на сервере этот "item_id" в параметр id нужно посмотреть, какой префикс используется, и вписать его на сервере в виде атрибута параметра контроллера: Для сложных типов достаточно вписать сам префикс (имя свойства байндер вытянет сам). Для простых - придется вписать полное имя параметра: public ActionResult Delete([Bind(Prefix = "item.id")] int Id) { ... } Или принимать "модель целиком" (достаточно бессмысленно в вашем слуае) - тогда байндер вытянет данные по имени параметра + имени свойства: public ActionResult Delete(SomeItem item) // забайндит item.Id { ... } Это же применимо и к случаю, когда "приходит вся модель", но с общим префиксом - Bind(Prefix = "item") точно так же срабатывает в случае, если в partial была, например, отрендерена форма редактирования для нескольких полей. Но именно в вашем случае - решение с @Html.Hidden("Id", item.Id) надежнее и проще.Ответ 2
Переделал вьюшку под @Html.Hidden("Id", item.Id) Потом передал через пост в контроллер public ActionResult Delete(int id){...} На прямую, через имя, обращаюсь Item.IdОтвет 3
Наверное в метод приходит вся модель, попробуйте принимать её в метод. Т.е. ваше определение метода, будет выглядеть следующим образом (если тип модели DBNewsItem) public ActionResult Delete(DBNewsItem model)
Комментариев нет:
Отправить комментарий