【问题标题】:Url.Action is how to reformat URLUrl.Action 是如何重新格式化 URL
【发布时间】:2013-10-08 11:51:29
【问题描述】:

我正在创建一个 MVC4 应用程序。 在我的合同控制器概述页面中,我有一个 Url.Action

int teller = 0;

            foreach (var item in Model)
            {
                <a href="@Url.Action("Details", "Contract",new { id = teller })">
                    <tr>
                        <td>@Html.DisplayFor(modelItem => item.ContractMSFNo)</td>
                        <td>@Html.DisplayFor(modelItem => item.StageCode)</td>
                        <td>@Html.DisplayFor(modelItem => item.ValidFromView)</td>
                        <td>@Html.DisplayFor(modelItem => item.ValidToView)</td>

                    </tr>
                </a>

                teller++;
            }

我需要传递 id。我在合同控制器的 ActionLink 详细信息中使用 id

我的控制器是

public ActionResult Details(int id)
        {
            //code

            return View(contract);
        }

当我点击链接时生成的网址

http://localhost:4826/Contract/Details/0
/0 是 id

我希望我的网址是 http://localhost:4826/Contract/Details

我知道这可以通过 Html.Actionlink 来实现,但我不得不使用 Url.Action。是否可以通过 Url.Action

来实现

【问题讨论】:

  • 你当然需要ID。当用户单击其中一个链接时,当您不传递ID 时,您将如何获得它的值。无论你做什么都是好的。
  • 这就是我要问的,有什么方法可以让我的网址出现 http://localhost:4826/Contract/Details(即没有 id)?
  • 然后你必须创建表单,将ID 存储在隐藏字段中并提交表单

标签: asp.net-mvc-4 url-rewriting url-routing


【解决方案1】:

如果您希望您的 URL 不带 id 参数,只需不要将其传递给 Url.Action() 方法,如下所示:

@Url.Action("Details", "Contract")

【讨论】:

  • 不,我需要传递 ID。我们在 Contract Controller 的 ActionLink 详细信息中使用 id。
  • 您“需要传递 ID”,但您“希望我的 Url 为 localhost:4826/Contract/Details”?
  • "是的。这是客户端的要求" 对不起,但在这里我要问:您的客户端是否比您更了解 Web 编程和将参数传递给 URL?如果是,请他展示他的表现,如果不是,请他让您完成这项工作......
【解决方案2】:

如果你添加like {id=teller} 那么路由会自动在链接末尾添加id参数。如果您不需要此 url 的 id 参数,则需要删除

new { id = teller } 

这样的最终版本

@Url.Action("Details", "Contract")

【讨论】:

  • 不,我需要传递 ID。我们在 Contract Controller 的 ActionLink 详细信息中使用 id
  • 好的,如果这是一个详细页面(你只有一个 id),你可以使用 session 或类似的东西。否则我不知道没有任何其他方法可以在没有参数的情况下传递 Id。
  • 不,实际上有很多 ids ...代码是foreach (var item in Model) { &lt;a href="@Url.Action("Details", "Contract",new { id = teller })"&gt;
【解决方案3】:

不能通过路由或 ActionLink 来完成。但是你可以尝试使用会话。

1) 将新方法添加到您的控制器以将您的 id 保存到会话:

public JsonResult Save(int id)
{
    Session["ID"] = id;
    return Json("Success");
}

2) 添加 jQuery 方法以从 View 中保存会话中的数据并从 Url.Action 中删除参数:

<a class="mylink" href="@Url.Action("Details", "Contract")"></a>

<script>
$(".mylink").click(function(){
  var data = { id : teller}; //**teller is from your example
  $.get("@Url.Action("Details", "Contract")", data)
});

</script>

3) 更改您的详细信息 ActionResult 以从会话中获取 id:

public ActionResult Details()
        {
            var id = (int)Session["ID"];

           //code

            return View(contract);
        }

P.S:询问您的客户,他希望如何提供 sombody 外部链接。如果 url 没有参数,那将是不可能的。这对 SEO 非常不利。

【讨论】:

    【解决方案4】:

    好的,阅读此评论:“实际上没有很多 id ... 代码是 foreach (var item in Model) { ”,我不确定我是否理解您真正想要实现的目标。您正在向视图传递一个参数,该参数只能有一个值。你确定你不是在寻找类似的东西:

    foreach (var item in Model) 
    { 
       <a href="@Url.Action("Details", "Contract",@item.ID>
       ...
    }
    

    相反? ID 在 URL 中是否可见的事实似乎是另一个问题,不是吗?

    【讨论】:

      猜你喜欢
      • 2019-02-27
      • 2011-05-29
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多