2015-01-09 2 views
1

Я зацикливаюсь на модели и повторяю данные. Я хочу добавить кнопку на каждый элемент, который генерирует действие/id.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> 

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

Однако, я получаю /Quote/ItemDetail? в отличие от /Цитата/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 } 
+2

попробуйте использовать @ Url.Action («ACTION», «CONTROLLER», новый {itemId = @ quote.Item.ItemID}) или @Url.Действие («ACTION», «CONTROLLER», null, new {itemId = @ quote.Item.ItemID}) – Zaphod

+0

Можете ли вы поместить здесь код контроллера? – renefc3

+0

@ Zaphod забыл упомянуть, что я использую T4MVC – DarkShadowAY

ответ

4

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

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

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

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

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

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

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

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

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

Update

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

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

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

+0

Эй, спасибо, хотя я все равно получаю тот же результат. – DarkShadowAY

+0

EDIT: Он работает, когда я проверяю инструменты для разработчиков хром! Однако, когда я нажимаю кнопку, я получаю: Quote/ItemDetail? в строке url – DarkShadowAY

+0

@DarkShadowAY - поэтому MVC отображает правильный атрибут href, но когда вы нажимаете его, параметр querystring удаляется из URL-адреса? Я не уверен, что вы подразумеваете под «работает в хром-инструментах». Если это так, проверьте скрипач, чтобы узнать, что происходит с запросами (возможно, MVC перенаправляет его по какой-либо причине). – danludwig