我利用模型绑定在一个动作方法签名中的3个不同位置填充一个特定的参数名称(2个过滤器实体参数和一个普通的控制器动作参数)。
即。
public ViewResult foo(Entity1 something, Entity2 somethingelse, somefield)
其中Entity1和Entity2都有一些字段。
对于我使用GET测试的一个请求,一切正常。对于另一个请求,我使用了POST,并且只填充了action方法中完全相同名称的参数。实体中的其余参数已正确映射。我用另一个参数测试了它,发现了相同的结果。
ASP.NET MVC是否仅通过POST请求的特定名称填充一个参数,但是GET请求的特定参数名称的参数的多个实例?这种“未定义”行为和模型绑定器的误用?
答案 0 :(得分:4)
我很确定还有其他不妥之处。我刚刚用以下
进行了测试public class Foo
{
public string Name { get; set; }
}
public class Bar
{
public string Name { get; set; }
}
并作为控制器方法:
[HttpPost]
public ActionResult Index(Foo bar, Bar foo, string Name)
{
return View();
}
并且视图只是一个简单的
@using (Html.BeginForm("Index", "Home")) {
@Html.TextBox("Name")
<input type="submit" value="save" />
}
并且按预期工作,bar.Name
,foo.Name
和Name
本身都填充了提交时提供的值。
因此POST和GET之间没有区别。
为了进一步详细说明,这就是MVC所做的,其中 MethodInfo 是System.Reflection.MethodInfo
类型的对象,它表示将要执行的操作方法:
ParameterInfo[] parameterInfos = MethodInfo.GetParameters();
var rawParameterValues =
from parameterInfo in parameterInfos
select ExtractParameterFromDictionary(parameterInfo, parameters, MethodInfo);
因此,对于为给定方法定义的每个参数,它将尝试从对象parameters
中检索参数值,其中包括查询字符串提供的内容。