已编辑:删除可能会导致问题混乱的多余代码。
使用的模型如下:
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>
(我应该补充说参数应该是:IsExpected = true&amp; IsInStock = true&amp; IsOutOfStock = false)
运行Fiddler4它告诉我所请求的URL(单击输入后立即):
并且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)
答案 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?。