1

Отредактировано: Удалить лишний код, который может помешать проблеме.Странная кнопка «почти» дублирование элементов

Модель, которая используется следующим образом:

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, то есть он дублирует дескрипторы параметров, но не значение, то есть истинный то ложь:

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

(Я хотел бы добавить, что параметры должны быть: IsExpected = истинная & IsInStock = & истинно IsOutOfStock = ложь)

Запуск Fiddler4 он говорит мне, что запрашиваемый URL (сразу после того, как вход щелкнул) является:

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

и прорыв точки в коде DisplayArrivals доказывает, что «дублирования 'происходит до того, как мой собственный код что-нибудь сделает?!?! Это заставляет меня думать, что это должна быть проблема привязки маршрутизации/сопоставления/модели.

Я хотел бы знать, почему это дублирует эти элементы запроса и, что более важно, как предотвратить его.

EDIT: В соответствии с просьбой вот как я произвожу входы для 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

Со всеми нерелевантными частями, которые вы включили, одна важная часть, которую вы не включили, - это то, как вы генерируете входы «IsInStock». – StriplingWarrior

ответ

1

Браузер будет посылать значение для этого флажка, если он установлен, так что будет не можете сказать, посмотрев на запрос, был ли флажок оставлен пустым или он просто не существовал на странице, на которую смотрел пользователь.

Чтобы обойти это, 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? для дальнейшего обсуждения.

+0

Ahh ... очень интересно ... и странно ... и смущает ...Я не тестировал приложение полностью, но ваше право в том, что обнаружение значения параметра в действиях, которые я тестировал, работает нормально, я просто волновался, увидев дублирование в querystring. –

Смежные вопросы