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

189
27 декабря 2017, 17:51
  @if (item.UserId == User.Identity.GetUserId().AsInt())
                {
                using (Html.BeginForm("Delete", "Home", FormMethod.Post))
                    {
                    @Html.AntiForgeryToken()
                    @Html.HiddenFor(m => item.Id)
                    <input type="submit" value="Delete" />
                    }
                }

Вот сам вид в 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. Почему ему ничего не приходит?

Answer 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) надежнее и проще.

Answer 2

Переделал вьюшку под

 @Html.Hidden("Id", item.Id)

Потом передал через пост в контроллер

 public ActionResult Delete(int id){...}

На прямую, через имя, обращаюсь Item.Id

Answer 3

Наверное в метод приходит вся модель, попробуйте принимать её в метод.

Т.е. ваше определение метода, будет выглядеть следующим образом (если тип модели DBNewsItem)

public ActionResult Delete(DBNewsItem model)
READ ALSO
Правильное подключение к серверу TcpClient.ConnectAsync

Правильное подключение к серверу TcpClient.ConnectAsync

После выполнения метода Clientmain выбрасывается исключение ObjectDisposedException (Доступ к ликвидированному объекту невозможен)

195
Управление Exchange Mail Server с помощью C#

Управление Exchange Mail Server с помощью C#

Добрый деньИмеется почтовый сервер Exchange 2013

129
Сумма чисел с плавающей точкой

Сумма чисел с плавающей точкой

Пытаясь посчитать сумму чисел заметил следующее поведение: 07 + 0

161
Обновление формы вариативного товара

Обновление формы вариативного товара

Всем приветСразу хочу сообщить-оправдаться, что только начинаю разбираться в веб-разработке

198