这看起来像是一个框架错误。该参数在请求的参数中具有正确的名称,但它并不总是绑定到action参数。它工作了6个月,但现在在整个应用程序中发生了几种操作方法。
我能够关闭VS或重新启动计算机,这通常会解决它。最近,当我碰到这个时,我无法通过它而不将参数转换为字符串然后转换为GUID。
关于如何处理这个问题的任何建议,因为我们有许多动作方法接受可以为空的Guid,并且必须手动转换参数。
我不想要一个解决方法,我想知道是否有人知道我如何调试这个或他们认为可能会发生什么。它是随机的,不一致的。
谢谢!
答案 0 :(得分:3)
如果没有实际遇到此问题,我最初的想法是,这是从浏览器传入的实际值的问题。
我用可以为空的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 :(得分:1)
确实,这是非常奇怪的行为。要调试它,您可能需要查看ASP.NET MVC的源代码。然后,您可以“进入”ModelBinder的方法。
您可能还想尝试创建自定义模型绑定器。首先,如果你想进入MVC的内置方法,这将为你提供一个更容易放置断点的地方。但是它也会让你有机会记录正在发生的事情(例如,确定绑定失败的情况),以及潜在地使用你自己的代码来确保模型在识别出问题的根源后正确绑定。
在你走得太远之前,你应该检查一下你是否已经在使用自定义模型绑定器,如果是,请检查它是否存在潜在的错误。您还应该确保您的模型类尽可能简单,并且不受可能的竞争条件或其他怪异的影响。