奇怪的查询字符'几乎'重复元素

时间:2015-11-03 16:07:56

标签: c# asp.net-mvc-4 model-view-controller asp.net-mvc-routing

已编辑:删除可能会导致问题混乱的多余代码。

使用的模型如下:

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

视图中的输入没什么特别/只是哑巴。

<input type="submit" value="Arrivals" name="DisplayArrivals" />

现在我已经设置了场景,问题有点奇怪......当我点击DisplayArrivals输入时,它会给出以下查询字符串,即它复制参数描述符但不复制值,即true然后为false:< / p>

  

http://localhost:55607/StockProcess?IsExpected=true&IsExpected=false&IsInStock=true&IsInStock=false&IsOutOfStock=false

     

(我应该补充说参数应该是:IsExpected = true&amp; IsInStock = true&amp; IsOutOfStock = false)

运行Fiddler4它告诉我所请求的URL(单击输入后立即):

  

http://localhost:55607/StockProcess?IsExpected=true&IsExpected=false&IsInStock=true&IsInStock=false&IsOutOfStock=false

并且DisplayArrivals代码中的断点证明在我自己的代码执行任何操作之前发生了'重复'?!?!这让我相信它必须是路由/映射/模型绑定问题。

我想知道为什么它会复制这些查询字符串元素,更重要的是如何防止它。

编辑:这里要求的是我如何生成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)

1 个答案:

答案 0 :(得分:1)

如果选中此复选框,浏览器将仅发送此复选框的值,因此无法通过查看请求来判断该复选框是否为空,或者它是否根本不存在用户正在查看的页面。

为了解决这个问题,ASP.NET插入一个隐藏的输入,说明IsInStock为false。这样,您在提交表单时始终会看到IsInStock的值,但是如果他们选中了该框,则会发布第二个true值,这将覆盖第一个MVC的模型绑定开始了。

这可能看起来很奇怪,但我没有看到它会导致任何问题。

有关进一步的讨论,请参阅Why does the CheckBoxFor render an additional input tag, and how can I get the value using the FormCollection?