从Ajax(BeginForm)向控制器传递模型时,模型始终为null

时间:2019-04-07 17:30:01

标签: c# ajax asp.net-mvc

我是C#ASP.Net MVC的新手,它来自Java / Spring。我目前在将模型绑定到表单并传递给模型时遇到问题。它总是以null的形式进入控制器。我尝试了各种尝试都无济于事。一定是简单的事情,我做错了。有什么想法吗?

//查看

@model BensHub.Models.VisitorMessage
@using (Ajax.BeginForm(
                "PostMessage",
                "VisitorBoard",
                new AjaxOptions { HttpMethod = "POST" }))
            {
                @Html.TextBoxFor(msg => msg.Name, new { @class = "board- 
                field", @style = "margin-top:8px;", @minlength 
                             ="1",maxlength = "28", placeholder ="Name" })

                @Html.TextAreaFor(msg => msg.Message, new { @class = 
                "board-field", @rows = "4", @minlength = "1", @maxlength = 
                "128",  @placeholder = "Something nice?", })

                <input class="board-submit" type="submit" value="Say It"/>
            }

//控制器

namespace BensHub.Controllers
{
public class VisitorBoardController : Controller
{
    [HttpPost]
    public ActionResult PostMessage(VisitorMessage message)
    {
        if (ModelState.IsValid)
        {

        }

        return Json(message);
    }
}
}

//路线

        routes.MapRoute(
            "MessagePost",
            "VisitorBoard/PostMessage",
            new { controller = "VisitorBoard", action = "PostMessage" }
        );

//型号

namespace BensHub.Models
{
    public class VisitorMessage
    {
        [Key]
        public int Id { get; set; }

        public DateTime DateTime { get; set; }

        [Required]
        [StringLength(28, MinimumLength = 1)]
        public string Name { get; set; }

        [Required]
        [StringLength(128, MinimumLength = 1)]
        public string Message { get; set; }
    }
}

3 个答案:

答案 0 :(得分:0)

我将您提供的代码复制并粘贴到新项目中,它可以按预期工作!您尚未在此处发布的内容是导致问题的原因。我会仔细检查您的路线,我的设置如下:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    "MessagePost",
    "VisitorBoard/PostMessage",
    new { controller = "VisitorBoard", action = "PostMessage" }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

路线的顺序会影响被击中的那条路线,如果我要交换底部两条路线的顺序,则会调用不同的动作

答案 1 :(得分:0)

我建议您在输入参数之前添加[FromBody]属性:

public class VisitorBoardController : Controller
{
    [HttpPost]
    public ActionResult PostMessage([FromBody] VisitorMessage message)
    { // ...
    }
}

答案 2 :(得分:0)

好的,我为有兴趣的人找出了这个问题。

[HttpPost]
public ActionResult PostMessage(VisitorMessage message)

动作参数'message'与模型中具有相同名称的属性发生冲突,从而使模型联编程序发疯,等等。只需将其重命名为其他名称或属性名称即可。