当属性继承自Dictionary <string,string =“”> </string,>时,WebApi modelBinding失败

时间:2013-06-11 17:45:08

标签: asp.net-web-api model-binding

当viewmodel 中的属性从Dictionary<string, string>继承时,WebApi模型绑定失败。当属性的数据类型更改为Dictionary<string, string>时,相同的模型绑定将起作用。

以下是绑定不起作用的示例。

当我将网页数据提交给ApiController时,绑定不会绑定 MyDictionary<string, string> ExtraData属性。如果我将属性更改为 Dictionary<string, string> ExtraData属性,则Api控制器将正确绑定。但是这不是一个选项,因为MyDictionary类具有我需要的其他功能。

我有一个继承自Dictionary <>的类,如下所示:

public class MyDictionary<TKey, TVal> : Dictionary<TKey, TVal>
{
}

我有一个类具有 MyDictionary

类型的属性
public class HomeModel
{
    public string Name{ get; set; }
    public MyDictionary<string, string> ExtraData { get; set; }

    public HomeModel()
    {
        ExtraData = new MyDictionary<string, string>();
    }
}

我有一个像这样的ApiController(它没有正确绑定。 ExtraData.Count总是返回零):

public class HomeApiController : ApiController
{
    // POST api/homeapi
    [HttpPost]
    [ActionName("Complex")]
    public string PostComplex([FromBody]HomeModel model)
    {
        return string.Format("vm.ExtraData.Count = {0}", model.ExtraData.Count);
    }
}

html表单片段如下所示:

    <ul>
    <li>
        <input type="text" name="ExtraData[0].Key" value="Key1"/>
        <input type="text" name="ExtraData[0].Value" value="Value1"/>
    </li>
    <li>
        <input type="text" name="ExtraData[1].Key" value="Key2"/>
        <input type="text" name="ExtraData[1].Value" value="Value2"/>
    </li>
    <li>
        <input type="text" name="ExtraData[2].Key" value="Key3"/>
        <input type="text" name="ExtraData[2].Value" value="Value3"/>
    </li>
</ul>

关于为什么模型绑定不适用于Dictionary<string, string>的继承属性的任何想法?

数据通过一个简单的帖子提交给ApiController,如下所示:

  var sendFormData = function (addr) {
            var jqxhr = $.post(addr, $('form').serialize())
                .success(function (x) {
                    alert(x);
                })
                .error(function () {
                    alert("Failure");
                });
            return false;
        };

        $("#submitWebApi").click(function () {
            $("form").submit(sendFormData('api/homeapi/complex'));
        });

0 个答案:

没有答案