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

C# 从Ajax(BeginForm)向控制器传递模型时,模型始终为空,c#,ajax,asp.net-mvc,C#,Ajax,Asp.net Mvc,我对来自Java/Spring的C#ASP.NETMVC的东西还不熟悉。我目前在将模型绑定到表单并将其传递时遇到问题。它总是以null的形式进入控制器。我试过各种各样的方法,但都没有用。一定很简单,我做错了。有什么想法吗 //看法 @model BensHub.Models.VisitorMessage @using (Ajax.BeginForm( "PostMessage", "VisitorBoard",

我对来自Java/Spring的C#ASP.NETMVC的东西还不熟悉。我目前在将模型绑定到表单并将其传递时遇到问题。它总是以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"/>
            }
//路线

        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; }
    }
}

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

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 }
);

路径的顺序将影响哪个路径会被击中,如果我要交换底部两条路径的顺序,则会调用不同的操作

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

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

好吧,我为所有感兴趣的人解决了这个问题

[HttpPost]
public ActionResult PostMessage(VisitorMessage message)

动作参数“message”与发送模型绑定器等的模型中同名的属性冲突。只需将其重命名为其他名称或属性名称。

添加jquery.unobtrusive-ajax.min.jsYep@Scripts.Render(“~/bundles/jquery”)@Scripts.Render后,您的代码看起来没问题(“~/bundles/jqueryOutrusive”)@Scripts.Render(“~/bundles/jqueryval”)-这包括用于不引人注目的ajax的脚本,如果您确定已正确映射对象的
属性
,则还可以尝试使用
公共操作结果PostMessage([FromBody]VisitorMessage)
。奇怪的是,如果我使用了您的映射,那么它甚至没有击中控制器,ajax请求中的操作url只是localhost:49397/并且什么也不做。这些值似乎输入到模型状态,但也设置为invalidAh抱歉,我的帖子不清楚,我将它指向我的HomeController。如果您将其作为第一个route它应该可以解决您的问题,我认为:
routes.MapRoute(“MessagePost”,“VisitorBoard/PostMessage”,new{controller=“VisitorBoard”,action=“PostMessage”});
这没有任何区别,仍然是空的!嗯
[HttpPost]
public ActionResult PostMessage(VisitorMessage message)