奇怪的查询字符串 'almost' 元素重复
Strange querystring 'almost' duplication of elements
已编辑: 删除可能会影响问题的多余代码。
使用的模型如下:
public class StockProcessSearchModel : BaseSearchModel
{
public bool IsOutOfStock { get; set; }
}
public class BaseSearchModel
{
public bool IsExpected { get; set; }
public bool IsInStock { get; set; }
}
这是唯一定义的路线:
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
name: "Home",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Authorisations", action = "Index", id = UrlParameter.Optional });
}
视图中的输入没什么特别的/只是愚蠢 html。
<input type="submit" value="Arrivals" name="DisplayArrivals" />
现在我已经设置了场景,问题有点奇怪...当我单击 DisplayArrivals 输入时它给出以下查询字符串,即它复制参数描述符但不复制值,即 true 然后 false :
(I should add that the parameters should be: IsExpected=true&IsInStock=true&IsOutOfStock=false)
运行 Fiddler4 它告诉我请求的 URL(单击输入后立即)是:
并且 DisplayArrivals 代码中的断点证明 'duplication' 在我自己的代码执行任何操作之前发生?!?!这让我相信它一定是路由/映射/模型绑定问题。
我想知道为什么它会复制这些查询字符串元素,更重要的是如何防止它。
编辑: 根据此处的要求,我如何生成 IsInStock 和 IsExpected 以及 IsOutOfStock 的输入:
@if (!Model.IsInStock && !Model.IsExpected && !Model.IsOutOfStock)
{
@Html.CheckBox("IsExpected", true)
@Html.CheckBox("IsInStock", true)
}
else
{
@Html.CheckBoxFor(m => m.IsExpected)
@Html.CheckBoxFor(m => m.IsInStock)
}
@Html.CheckBoxFor(m => m.IsOutOfStock)
如果复选框被选中,浏览器只会发送一个值,因此无法通过查看请求来判断复选框是否留空或根本不存在用户正在查看的页面。
为了解决这个问题,ASP.NET 插入了一个隐藏的输入,表明 IsInStock
是错误的。这样,当提交表单时,您将始终看到 IsInStock
的值,但如果他们选中该框,则会发布第二个 true
值,这将在 MVC 模型时覆盖第一个绑定开始。
这可能看起来很奇怪,但我没有发现它会导致任何问题。
有关进一步讨论,请参阅 Why does the CheckBoxFor render an additional input tag, and how can I get the value using the FormCollection?。
已编辑: 删除可能会影响问题的多余代码。
使用的模型如下:
public class StockProcessSearchModel : BaseSearchModel
{
public bool IsOutOfStock { get; set; }
}
public class BaseSearchModel
{
public bool IsExpected { get; set; }
public bool IsInStock { get; set; }
}
这是唯一定义的路线:
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
name: "Home",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Authorisations", action = "Index", id = UrlParameter.Optional });
}
视图中的输入没什么特别的/只是愚蠢 html。
<input type="submit" value="Arrivals" name="DisplayArrivals" />
现在我已经设置了场景,问题有点奇怪...当我单击 DisplayArrivals 输入时它给出以下查询字符串,即它复制参数描述符但不复制值,即 true 然后 false :
(I should add that the parameters should be: IsExpected=true&IsInStock=true&IsOutOfStock=false)
运行 Fiddler4 它告诉我请求的 URL(单击输入后立即)是:
并且 DisplayArrivals 代码中的断点证明 'duplication' 在我自己的代码执行任何操作之前发生?!?!这让我相信它一定是路由/映射/模型绑定问题。
我想知道为什么它会复制这些查询字符串元素,更重要的是如何防止它。
编辑: 根据此处的要求,我如何生成 IsInStock 和 IsExpected 以及 IsOutOfStock 的输入:
@if (!Model.IsInStock && !Model.IsExpected && !Model.IsOutOfStock)
{
@Html.CheckBox("IsExpected", true)
@Html.CheckBox("IsInStock", true)
}
else
{
@Html.CheckBoxFor(m => m.IsExpected)
@Html.CheckBoxFor(m => m.IsInStock)
}
@Html.CheckBoxFor(m => m.IsOutOfStock)
如果复选框被选中,浏览器只会发送一个值,因此无法通过查看请求来判断复选框是否留空或根本不存在用户正在查看的页面。
为了解决这个问题,ASP.NET 插入了一个隐藏的输入,表明 IsInStock
是错误的。这样,当提交表单时,您将始终看到 IsInStock
的值,但如果他们选中该框,则会发布第二个 true
值,这将在 MVC 模型时覆盖第一个绑定开始。
这可能看起来很奇怪,但我没有发现它会导致任何问题。
有关进一步讨论,请参阅 Why does the CheckBoxFor render an additional input tag, and how can I get the value using the FormCollection?。