Параметр действия MVC непоследовательно связывается с обнуляемым Guid - PullRequest
3 голосов
/ 11 ноября 2011

Это действительно похоже на ошибку фреймворка.Параметр находится в параметрах запроса с правильным именем, но он не всегда привязывается к параметру действия.Это работало в течение 6 месяцев, но теперь это происходит в нескольких методах действия по всему приложению.

Мне удалось либо закрыть VS, либо перезагрузить компьютер, и это обычно исправляло это.В последнее время, когда я столкнулся с этим, я не мог обойтись без превращения параметра в строку и последующего преобразования в GUID.

Любой совет о том, что делать с этим, так как у нас есть много методов действия, принимающих обнуляемые Guidsи это боль, чтобы вручную преобразовать параметр.

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

спасибо!

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

На самом деле, не имея этой проблемы, я думал, что это проблема с фактическими значениями, передаваемыми из браузера.

Я отлаживал похожую проблему, подобную этой, с помощью обнуляемого DateTimes и смог обойти ее, написав привязку пользовательской модели и настроив ее только для связывания DateTime? типы.

Делая это, вы можете проверить передаваемые значения и проверить их на наличие аномалий.

Это довольно просто сделать. В тебе global.asax:

ModelBinders.Binders.Add(typeof(guid?), new GuidModelBinder());

А потом создать класс

public class GuidModelBinder : IModelBinder
    {

        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            var modelState = new ModelState { Value = valueResult };
        }
        //Do whatever you need to inspect the valueResult in here
    }
1 голос
/ 11 ноября 2011

Это действительно очень странное поведение. Чтобы отладить его, вы можете проверить исходный код ASP.NET MVC. Затем вы можете «войти» в методы ModelBinder.

Возможно, вы также захотите попробовать создать пользовательское связующее для моделей. Прежде всего, это даст вам более удобное место для установки точки останова, если вы захотите войти во встроенные методы MVC. Но это также даст вам возможность регистрировать происходящее (например, для выявления случаев, когда привязка не срабатывает), а также потенциально использовать собственный код для обеспечения правильного связывания модели после определения причины проблемы.

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

...