MVC + T4MVC - 如何将url动作传递给表单?或者另一种生成action / id的方法?

时间:2015-01-09 12:44:05

标签: c# asp.net-mvc asp.net-mvc-4 t4mvc

我循环浏览模型并迭代数据。我想在每个生成动作/ id的项目上添加一个按钮。

由于我无法在按钮上添加网址,因此我决定使用以下表单:

<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();
}

RouteConfig:

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

1 个答案:

答案 0 :(得分:4)

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

恕我直言,这是你应该做的事情,因为你只发送了一个参数。