gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:44:03 25 4
gpt4 key购买 nike

所以,我的网站上有一个搜索表单,它将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com