MVC + T4MVC - Как передать URL-адрес в форму? Или альтернативный метод генерации действия/идентификатора?

Я перебираю модель и перебираю данные. Я хочу добавить кнопку для каждого элемента, который генерирует действие/идентификатор.

Поскольку я не могу добавить URL к кнопке, я решил использовать форму со следующим:

<form action="@Url.Action("ItemDetail", new { itemId = @quote.Item.ItemID})">
    <button class="btn-bg btn-sm btn-inverse btn-fix-width" type="submit">
        <i class="fa fa-th-list fa-fw pull-right"></i>View RFQ
    </button>
</form>

Я выбрал кнопку вместо типа ввода, чтобы вставить значки с потрясающим шрифтом.

Однако я получаю /Quote/ItemDetail? вместо /Quote/ItemDetail?itemId=123.

Я использую T4MVC

Контроллер:

public virtual ActionResult ItemDetail(int ItemID)
{
    return View();
}

Конфигурация маршрута:

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

person DarkShadowAY    schedule 09.01.2015    source источник
comment
попробуйте использовать @Url.Action(ACTION, CONTROLLER, new {itemId = @quote.Item.ItemID}) или @Url.Action(ACTION, CONTROLLER, null, new {itemId = @quote.Item.ItemID})   -  person Zaphod    schedule 09.01.2015
comment
Можете ли вы разместить код контроллера здесь?   -  person renefc3    schedule 09.01.2015
comment
@Zaphod забыл упомянуть, что я использую T4MVC   -  person DarkShadowAY    schedule 09.01.2015
comment
@ renefc3 В соответствии с просьбой. Я обновил свой вопрос.   -  person DarkShadowAY    schedule 09.01.2015


Ответы (1)


С T4MVC должно работать что-то вроде этого:

<form action="@Url.Action(MVC.Quote.ItemDetail(quote.Item.ItemID))">

...Обратите внимание, что это предполагает, что действие ItemDetail выполняется на вашем QuoteController. Если имя контроллера отличается, измените Quote на имя вашего контроллера.

Вы также можете пойти дальше с комментарием @Zaphod и сделать что-то вроде этого:

<form action="@Url.Action(MVC.Quote.ActionNames.ItemDetail, MVC.Quote.Name,
    new { itemId = @quote.Item.ItemID})">

... по крайней мере, здесь T4MVC избавляется от ваших волшебных строк, даже если вы все еще используете MVC из коробки Url.Action перегрузки.

Вы также должны называть аргументы метода действия, используя camelCase, а не PascalCase:

public virtual ActionResult ItemDetail(int itemId) // instead of ItemID
{
    return View();
}

... хотя я не думаю, что это должно вызвать какие-либо проблемы.

Обновить

Попробуйте это, может быть?

<form method="GET" action="@Url.Action(MVC.Quote.ItemDetail(quote.Item.ItemID))">

или это:

<form method="GET" action="@Url.Action(MVC.Quote.ActionNames.ItemDetail, MVC.Quote.Name)">
    <input type="hidden" name="itemId" value="@quote.Item.ItemID" />
    <button class="btn-bg btn-sm btn-inverse btn-fix-width" type="submit">
        <i class="fa fa-th-list fa-fw pull-right"></i>View RFQ
    </button>
</form>

Еще одно обновление:

Вы также должны иметь возможность сделать это вместо этого, а затем использовать CSS, чтобы ваша ссылка выглядела как кнопка:

<a href="@Url.Action(MVC.Quote.ItemDetail(quote.Item.ItemID))">
    <i class="fa fa-th-list fa-fw pull-right"></i>View RFQ
</a>

ИМХО, это то, что вы действительно должны сделать, поскольку вы отправляете только один параметр.

person danludwig    schedule 09.01.2015
comment
Эй, спасибо, хотя я все еще получаю тот же результат. - person DarkShadowAY; 09.01.2015
comment
РЕДАКТИРОВАТЬ: это работает, когда я проверяю инструменты разработчика Chrome! Однако, когда я нажимаю кнопку, я получаю: Quote/ItemDetail? в адресной строке - person DarkShadowAY; 09.01.2015
comment
@DarkShadowAY - значит, MVC отображает правильный атрибут href, но когда вы щелкаете по нему, параметр строки запроса удаляется из URL-адреса? Я не уверен, что вы имеете в виду, говоря, что это работает в инструментах разработчика Chrome. Если это так, проверьте fiddler, чтобы увидеть, что происходит с запросами (возможно, MVC по какой-то причине перенаправляет его). - person danludwig; 09.01.2015
comment
Да, когда я иду проверять действие формы с помощью веб-разработчика, он генерирует: /Quote/ItemDetail?itemId=4084. Однако, когда я нажимаю на кнопку, я получаю: locahost:3435/Quote/ItemDetail? - Кажется, он не поднимает действие - person DarkShadowAY; 09.01.2015
comment
@DarkShadowAY ваши маршруты выглядят хорошо. Используйте Fiddler для проверки HTTP-запросов и ответов, которые происходят после нажатия на ссылку. Когда вы наводите курсор на ссылку, я предполагаю, что вы видите правильный URL внизу страницы? Если это так, что-то еще происходит, когда сервер получает запрос. Fiddler должен помочь вам понять это. - person danludwig; 09.01.2015
comment
При наведении курсора на форму ничего не появляется. Путь /Quote/ItemDetail?itemId=4084 вместо localhost/Quote/ItemDetail?itemId=4084 спасибо - person DarkShadowAY; 09.01.2015
comment
Я добавил ‹form [email protected](MVC.Quote.ItemDetail(quote.Item.ItemID), Request.Url.Scheme)›, который дает полный URL-адрес localhost/Quote/ItemDetail?itemId=4084, но щелчок меняет его. Так странно. Я отмечаю как решенный, поскольку вы ответили на мой первоначальный вопрос, но буду признателен за дальнейшую помощь. Ваше здоровье. Я также пробовал fidder, почти такую ​​же информацию он направляет на localhost/Quote/ItemDetail? - person DarkShadowAY; 09.01.2015
comment
@DarkShadowAY, как я уже дважды говорил, загрузите Fiddler и используйте его для проверки необработанного HTTP-трафика. - person danludwig; 09.01.2015
comment
Отредактированный предыдущий комментарий - я пробовал fiddler, и его запрос GET localhost/Quote/ItemDetail? - person DarkShadowAY; 09.01.2015
comment
@DarkShadowAY, который запутался. Вы уверены, что это единственный запрос, который приходит после нажатия на ссылку? И вы видите такое же поведение в Firefox и Internet Explorer? - person danludwig; 09.01.2015
comment
У меня действительно есть. Это, безусловно, имеет какое-то отношение к тому, как обрабатывается форма. Я просто поместил то же самое в URL-адрес href, и это сработало отлично! - person DarkShadowAY; 09.01.2015
comment
@DarkShadowAY Я обновил свой ответ. Посмотрите, поможет ли добавление атрибута method="get" к элементу формы. - person danludwig; 09.01.2015
comment
Я полностью пропустил это. Это был пост, спасибо за помощь! :) - person DarkShadowAY; 09.01.2015
comment
@DarkShadowAY хорошо, что ты свел меня с ума. GET — это метод по умолчанию, поэтому, если вы его опускаете, он должен выполнять GET по умолчанию. stackoverflow.com/a/2314441/304832 В будущем опубликуйте весь соответствующий код. - person danludwig; 09.01.2015