MVC + T4MVC - 如何将 url 动作传递给表单?或者生成 action/id 的替代方法?
MVC + T4MVC - How to pass a url action to form? Or an alternative method to generate action/id?
我正在遍历模型并迭代数据。我想在每个生成 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? 而不是 /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 }
使用 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 使您的 link 看起来像一个按钮:
<a href="@Url.Action(MVC.Quote.ItemDetail(quote.Item.ItemID))">
<i class="fa fa-th-list fa-fw pull-right"></i>View RFQ
</a>
恕我直言,这是你真正应该做的,因为你只发送一个参数。
我正在遍历模型并迭代数据。我想在每个生成 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? 而不是 /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 }
使用 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 使您的 link 看起来像一个按钮:
<a href="@Url.Action(MVC.Quote.ItemDetail(quote.Item.ItemID))">
<i class="fa fa-th-list fa-fw pull-right"></i>View RFQ
</a>
恕我直言,这是你真正应该做的,因为你只发送一个参数。