【问题标题】:Does an action parameter have a default value?动作参数是否有默认值?
【发布时间】:2014-07-14 18:40:42
【问题描述】:

如何在 ASP.NET MVC 的自定义 ModelBinder 中找出我是否绑定到具有默认值的参数?

默认值:

public void Show(Ship ship = null)
{
     // ...
}

无默认值:

public void Show(Ship ship)
{
     // ...
}

模型绑定器:

public class ModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var modelType = bindingContext.ModelType;

        // Is it an item from the database?
        if (typeof(IDbObject).IsAssignableFrom(modelType))
        {
            // Get from database...
            var result = BindValue();

            if (result == null && NotOptional()) // Code for NotOptional needed
                throw new Exception();

            return result;
        }
    }
}

我想知道这一点,因为如果用户对某个操作发出请求并且未提供所有必要信息(这将是所有没有默认值的参数),我想显示一条错误消息。

【问题讨论】:

  • if (ship == null) { // 没有信息 } else { // 有信息 } ,我觉得有用吗?这里有什么问题?
  • 你能把代码显示在你想知道的地方吗?您的 binder 何时调用模型上的方法?
  • @Aaron:检查应该在模型绑定器中自动执行,这样我们就不必检查每个操作方法。
  • @CodeCaster:更新问题以包含示例代码。
  • 什么你想在那里测试可选?

标签: c# asp.net-mvc custom-model-binder


【解决方案1】:

如果我理解正确,可以查询参数是否用OptionalAttribute修饰

var method = typeof(YourClassName).GetMethod("Show");
foreach (var pi in method.GetParameters())
{
    var optionalAttribute = pi.GetCustomAttributes<OptionalAttribute>().FirstOrDefault();
    if (optionalAttribute != null)
    {
        //This is optional parameter
        object defaultValue = pi.DefaultValue;
    }
}

【讨论】:

  • 在模型绑定器中使用这样的反射是否存在任何性能问题?
  • 我不知道 mvc,所以我无法回答你的问题,直到你能说出它被调用的频率?见How costly is Reflection?
【解决方案2】:

我认为没有任何有效或合理的方法来判断方法输入参数是否具有默认值。如果您正在寻找一种确保传入数据正确的方法,您可能希望将视图表单字段绑定到模型并使用 ModelState.IsValid 来测试所有字段是否都有数据。

可以在这里找到一个很好的介绍:http://www.codeproject.com/Articles/710776/Introduction-to-ASP-NET-MVC-Model-Binding-An-Absol

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 2018-11-07
    • 2012-12-01
    • 1970-01-01
    • 2023-01-11
    • 2013-01-17
    • 2012-08-01
    • 2022-06-13
    相关资源
    最近更新 更多