ASP.NET MVC - 模型在不同实体中绑定多个具有相同名称的参数 - GET和POST不同?

时间:2011-09-12 17:02:52

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

我利用模型绑定在一个动作方法签名中的3个不同位置填充一个特定的参数名称(2个过滤器实体参数和一个普通的控制器动作参数)。

即。

public ViewResult foo(Entity1 something, Entity2 somethingelse, somefield)

其中Entity1和Entity2都有一些字段。

对于我使用GET测试的一个请求,一切正常。对于另一个请求,我使用了POST,并且只填充了action方法中完全相同名称的参数。实体中的其余参数已正确映射。我用另一个参数测试了它,发现了相同的结果。

ASP.NET MVC是否仅通过POST请求的特定名称填充一个参数,但是GET请求的特定参数名称的参数的多个实例?这种“未定义”行为和模型绑定器的误用?

1 个答案:

答案 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.Namefoo.NameName本身都填充了提交时提供的值。

因此POST和GET之间没有区别。

为了进一步详细说明,这就是MVC所做的,其中 MethodInfo System.Reflection.MethodInfo类型的对象,它表示将要执行的操作方法:

ParameterInfo[] parameterInfos = MethodInfo.GetParameters();
var rawParameterValues = 
        from parameterInfo in parameterInfos
        select ExtractParameterFromDictionary(parameterInfo, parameters, MethodInfo);

因此,对于为给定方法定义的每个参数,它将尝试从对象parameters中检索参数值,其中包括查询字符串提供的内容。