c# - ASP.NET MVC(三)绑定(bind)POST值到 'object'类型使对象成为System.String[],为什么?

标签 c# asp.net-mvc asp.net-mvc-3

所以,我的网站上有一个搜索表单,它将 Search.Value 作为参数发布,在项目中有一个名为 Search 的类,其属性为 Value 是一个对象。当值由模型绑定(bind)器绑定(bind)时,对象始终是 System.String[],无论我传入的是单个数字、单个单词还是其他任何内容。

有人可以向我解释为什么会这样吗,或者我是否可以让它停止这样做?

代码如下:

// Search.cs
public sealed class Search {
    private object _Value = null;

    public object Value {
        get {
            return this._Value;
        }
        set {
            if (value != null) {
                this._Value = value;

                this.IsInt32 = (this._Value is Int32);
                this.IsString = (this._Value is String);
            };
        }
    }

    public bool IsInt32 { get; set; }
    public bool IsString { get; set; }
}

// SearchController.cs
[HttpPost]
public ActionResult List(
    [Bind(Prefix = "Search", Include = "Value")] Search Search) {
    return this.View();
}

// Form HTML
<form action="/Administration/Search" method="post">
    @Html.TextBox("Search.Value", Model.Search.Value, new { type = "search", placeholder = "Search", size = 48, required = string.Empty })
    <input type="submit" value="&#8981;" />
</form>

更新

根据@Darin 的建议和示例,我制作了一个自定义 Binder ,到目前为止它似乎可以正常工作。这是代码,如果其他人遇到这个,当然可以根据需要修改:

public class SearchModelBinder : DefaultModelBinder {
    public override object BindModel(
        ControllerContext ControllerContext,
        ModelBindingContext BindingContext) {
        if (BindingContext == null) {
            throw new ArgumentNullException("BindingContext");
        };

        ValueProviderResult ValueResult = BindingContext.ValueProvider.GetValue(BindingContext.ModelName + ".Value");

        if (ValueResult == null) {
            return (null);
        };

        string Value = ValueResult.AttemptedValue;

        if (String.IsNullOrEmpty(Value)) {
            return (null);
        };

        int Int;

        if (int.TryParse(Value, out Int)) {
            return new Search {
                Value = Convert.ToInt32(Value)
            };
        };

        long Long;

        if (long.TryParse(Value, out Long)) {
            return new Search {
                Value = Convert.ToInt64(Value)
            };
        };

        return new Search {
            Value = Value
        };
    }
}

最佳答案

不知道您要实现什么,为什么要使用 object,...但是您可以为此 Search 模型编写自定义模型绑定(bind)器。此模型绑定(bind)器会将请求中发送的参数直接分配给 Value 属性:

public class SearchModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Value");
        if (value != null)
        {
            return new Search
            {
                Value = value.AttemptedValue
            };
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

您可以在 Global.asax 中注册:

ModelBinders.Binders.Add(typeof(Search), new SearchModelBinder());

关于c# - ASP.NET MVC(三)绑定(bind)POST值到 'object'类型使对象成为System.String[],为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6319815/

相关文章:

c# - 使用 S7netplus 在 C# 中读取西门子 PLC s7 字符串

javascript - 如何使用 jquery 禁用列表框中的多项选择?还是javascript?

asp.net-mvc-3 - ASP MVC3 本地化 URL 查询字符串参数

asp.net-mvc - Asp.net MVC 3 RC-Razor ValidationMessage对于CustomMessage和ClientSideValidation问题

asp.net-mvc - 更新数据库 - 列不存在

asp.net-mvc-3 - MvcMailer:无法在使用 Url.Action 的 Razor View 上完成 NUnit 测试

c# - 使用 MRTK 在 Hololens 中显示天空盒

c# - "Date Taken"在 Windows 资源管理器中显示在文件详细信息(文件属性)中时未显示在 Image PropertyItems 中

c# - 如何使用 Linq 获得最高值(value)

javascript - 使用 Web API 的纯前端 JavaScript 与使用 ajax 的 MVC View