当显式定义控制器参数时,默认模型绑定器会发生异常

Default model binder freaks out when explicitly defining controller parameter

本文关键字:绑定 模型 异常 默认 定义 控制器 参数      更新时间:2023-09-26

我正试图弄清楚MVC3中的模型绑定。看看这个例子。

这是控制器代码:

public ActionResult Index()
    {
        Person person = new Person{ Name = "Test" };
        return View(person);
    }
    [HttpPost]
    public string Edit(Person personModel)
    {
        return string.Format("From server: {0}", personModel.Name);
    }

这是html/javascript位:

@model MCV3.Test.Models.Person
<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript">
    $(document).ready(function (){
        var model = @Html.Raw(Json.Encode(Model));
        $.ajax({
            url : "/Person/Edit", 
            type: "Post",
            datatype: "json",
            data :  model, 
            success: function (data) {                   
                $("#result").text(data);                    
            }
        });
    });
</script>
</head>
<body>
    <label id="result"></label>
</body>
</html>

上面的代码有效,但如果我将ajax调用的数据设置更改为:

$.ajax({
            url : "/Person/Edit", 
            type: "Post",
            datatype: "json",
             data : {personModel : model},
            success: function (data) {                   
                $("#result").text(data);                    
            }
        });

它不再起作用:模型的类型正确,但name属性为null。

在有效的示例中,post参数为:

Name    Test
Name=Test

但在不起作用的例子中,它们是:

personModel[Name]   Test
personModel%5BName%5D=Test

如果请求看起来像这样,MVC似乎无法序列化:personModel[Name] Test

有没有什么方法可以在不编写自定义活页夹的情况下解决这个问题?

MVC绑定尝试创建并填充Person对象以传递给Edit操作时,它会尝试查找Person对象上所有可设置属性的值;在这种情况下是CCD_ 5属性。因此,它在表单数据、查询字符串数据等中查找关键字为"name"的名称-值对。你的工作榜样有一个,而你的非工作榜样没有。

如果你想以这种格式发布数据,你可以创建一个自定义的ValueProvider,它解析数据并根据它的发现返回值。