我是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; }
}
}
答案 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'与模型中具有相同名称的属性发生冲突,从而使模型联编程序发疯,等等。只需将其重命名为其他名称或属性名称即可。