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>

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