ASP.NET Core MVC模型绑定错误?

时间:2018-09-09 04:51:57

标签: c# asp.net-core asp.net-core-mvc model-binding

我在使用ASP.NET Core的model binding时遇到了麻烦。基本上,我只是想将一些POSTed json绑定到具有嵌套属性的对象模型。下面为单个按钮提供了最少的代码,按下该按钮将通过XMLHttpRequest将其发布到Controller动作方法。 action方法采用具有[FromBody]属性的单个模型类参数。

型号:

public class OuterModel {
    public string OuterString { get; set; }
    public int OuterInt { get; set; }
    public InnerModel Inner { get; set; }
}

public class InnerModel {
    public string InnerString { get; set; }
    public int InnerInt { get; set; }
}

控制器:

using Microsoft.AspNetCore.Mvc;

public class HomeController : Controller {

    [HttpPost("models/")]
    public IActionResult Save([FromBody] OuterModel viewModel) {
        if (!ModelState.IsValid)
            return BadRequest(ModelState);

        // Return an appropriate response
        return Ok();
    }
}

“提交”按钮的剃刀标记:

<div class="form-row">
    <div class="col-2">
        @{ string url = Url.Action(nameof(HomeController.Save), "Home"); }
        <button id="post-btn" data-post-url="@url">POST</button>
    </div>
</div>

要提交的JavaScript(不绑定):

document.getElementById("post-btn").addEventListener("click", e => {
        const xhr = new XMLHttpRequest();
        xhr.addEventListener("timeout", () => console.error("Timeout"));
        xhr.addEventListener("error", () => console.error("Error"));
        xhr.addEventListener("load", () => console.log(`Status: ${xhr.status} ${xhr.statusText}`));
        xhr.open("POST", e.target.dataset.postUrl);
        xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        xhr.send(JSON.stringify({
            "OuterString": "outer",
            "OuterInt": 1,
            "Inner.InnerString": "inner",
            "Inner.InnerInt": 5
        }));
    });

看看该JavaScript,我希望Inner.* json属性名能够正确绑定,因为docs的这一行:

  

模型绑定查找模式 parameter_name.property_name 将值绑定到属性。如果找不到此形式的匹配值,它将尝试仅使用属性名称进行绑定。

但事实并非如此; action方法中的OuterModel.Inner属性以null结尾。但是,以下json 正确绑定了

要提交的JavaScript(绑定DOES):

xhr.send(JSON.stringify({
    "OuterString": "outer",
    "OuterInt": 1,
    "Inner": {
        "InnerString": "inner",
        "InnerInt": 5
    }
}));

因此,我可以使用此代码来实现所需的模型绑定,我对于第一个JavaScript 没有起作用的原因感到困惑。嵌套属性是否使用了正确的命名约定?一些澄清将不胜感激!

0 个答案:

没有答案