我目前阅读Freeman的书ASP .NET MVC 4并编写一个Web应用程序。因此,有一个名为“ Cart”的控制器,其方法为“ AddToCart”和一个视图。在视图中,我们有这样的代码:

@model SportsStore.Domain.Entities.Product

<div class="item">
    <h3>@Model.Name</h3>
    @Model.Description
    @using (Html.BeginForm("AddToCart", "Cart"))
    {
        @Html.HiddenFor(x => x.ProductID)
        @Html.Hidden("returnUrl", Request.Url.PathAndQuery)
        <input type="submit" value="+ Add to cart" />
    }

    <h4>@Model.Price.ToString("c")</h4>
</div>


以及控制器代码的方法:

public RedirectToRouteResult AddToCart(Cart cart, int productId, string returnUrl)
{
   Product product = repository.Products
      .FirstOrDefault(p => p.ProductID == productId);
   if (product != null)
   {
      cart.AddItem(product, 1);
   }
   return RedirectToAction("Index", new { returnUrl });
}


该代码编译很好,但是我在这里有一些问题。

1)如果在行上放置断点:

return RedirectToAction("Index", new { returnUrl });


您会看到returnUrl的值为“ /”。怎么样?他从哪儿得到的?

2)这些代码行在做什么,因为在书中没有关于它的信息。

@Html.HiddenFor(x => x.ProductID)
@Html.Hidden("returnUrl", Request.Url.PathAndQuery)

最佳答案

首先让我回答您的第二个问题。
@HTML有一组生成HTML的助手。

@Html.HiddenFor(x => x.ProductID)


将输出如下内容:<input type="hidden" name="ProductID" value="1" />

@Html.Hidden("returnUrl", Request.Url.PathAndQuery)


将输出如下内容:<input type="hidden" name="returnUrl" value"/" />

现在查看AddToCart方法签名:

AddToCart(Cart cart, int productId, string returnUrl)

这些隐藏输入的值,但在发布到AddToCart操作和模型绑定时将包含在表单中,并将它们相应地分配给productIdreturnUrl参数。

接下来回答第一个问题:

Request.Url.PathAndQuery属性返回带有查询参数的请求的绝对路径。因此,如果您从索引视图进入AddToCart视图,则returnUrl将为“ /”,
因为您的索引视图可以说是Web应用程序的根。一切都取决于如何在应用程序中配置路由。

有关更多信息,请观看以下教程:Controllers and Routing

关于c# - RedirectToAction ASP .NET MVC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23091269/

10-08 22:32