Страницы

Поиск по вопросам

среда, 4 марта 2020 г.

Как отправить @Html.HiddenFor(m => item.Id) в контроллер?

#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)

Комментариев нет:

Отправить комментарий