如何解决ASP.NET MVC3将POST值绑定到“对象”类型会使该对象成为System.String [],为什么?
| 因此,我在我的网站上有一个搜索表单,该表单以Search.Value
作为参数,项目中有一个名为Search
的类,其属性为Value
,即is3ѭ。当值由模型绑定器绑定时,无论我传递的是单个数字,单个单词还是其他任何值,对象始终为4。
有人可以向我解释为什么会这样,还是我可以让它停止这样做呢?
这是代码:
// 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=\"⌕\" />
</form>
更新
根据@Darin的建议和示例,我制作了一个自定义的活页夹,到目前为止,它似乎仍在工作。如果有其他人遇到,这里是代码,请根据需要进行修改:
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
模型编写自定义模型绑定程序。该模型绑定器将直接将请求中发送的参数分配给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());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。