1

我创建了一个自定义模型绑定器来绑定 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 被删除 - 但是它可能会在其他地方抬头......

4

0 回答 0