我创建了一个自定义模型绑定器来绑定 int,以便在字符串值大于 int.maxvalue 时进行处理 - 我们有很多使用 UpdateModel 的遗留代码,如果要转换为 int 的字符串值,此方法会引发异常大于 int.MaxValue。如果我将对 UpdateModel 的调用修改为 TryUpdateModel,则更新会正常失败并在视图中显示错误,但我想要更有意义的错误消息 - 因此需要自定义模型绑定器。模型活页夹工作正常,但是我有一个类似于以下的操作
public ActionResult List(ListCriteria criteria, int page)
ListCriteria 类有一个属性,如下所示
public int Page { get; set;}
我的自定义模型绑定器实现了 IModelBinder。与相当多的示例类似,它的实现类似于以下。
public class IntModelBinder : IModelBinder {
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext) {
ValueProviderResult valueResult = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName);
ModelState modelState = new ModelState { Value = valueResult };
object actualValue = null;
try {
actualValue = Convert.ToInt32(valueResult.AttemptedValue,
CultureInfo.CurrentCulture);
}
catch (FormatException e) {
modelState.Errors.Add(e);
}
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
return actualValue;
}
}
调用该操作时,模型绑定器会在此行引发异常:
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
并且异常消息是“已添加具有相同密钥的项目”。显然这是因为 ListCriteria 对象上的 Page 属性已经被绑定,并且被添加到了字典中——当页面参数被绑定和添加时,就会抛出异常。
这应该如何实施?难道不能在对象层次结构的不同级别上拥有同名的属性吗?
在我的情况下,事实证明 Page 属性和 page 参数执行相同的功能,因此后者 cna 被删除 - 但是它可能会在其他地方抬头......