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

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

Поскольку я не могу добавить 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>

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

Тем не менее, я получаю / Цитировать /ItemDetail? в отличие от /Quote/ItemDetail?itemId=123

Я использую T4MVC

контроллер:

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

RouteConfig:

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

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>

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

Другие вопросы по тегам