Модель всегда равна нулю при передаче модели из Ajax (BeginForm) в контроллер - PullRequest
0 голосов
/ 07 апреля 2019

Я новичок в C # ASP.Net MVC материал, пришедший из Java / Spring. У меня проблемы с привязкой модели к форме и ее передачей. Он всегда входит в контроллер как ноль. Я пробовал разные вещи безрезультатно. Должно быть что-то простое, я делаю не так. Есть идеи?

// Просмотр

@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 голосов
/ 07 апреля 2019

Я предлагаю вам добавить атрибут [FromBody] перед входным параметром:

public class VisitorBoardController : Controller
{
    [HttpPost]
    public ActionResult PostMessage([FromBody] VisitorMessage message)
    { // ...
    }
}
0 голосов
/ 07 апреля 2019

Хорошо, я решил эту проблему для всех, кто заинтересован.

[HttpPost]
public ActionResult PostMessage(VisitorMessage message)

Параметр действия 'message' конфликтует с одноименным свойством в модели, что приводит к сумасшествию связующего элемента модели и т. Д. Просто переименуйте его в другое имя или в имя свойства.

0 голосов
/ 07 апреля 2019

Я скопировал и вставил предоставленный вами код в новый проект, и он работает как положено! То, что вы не опубликовали здесь, является причиной проблемы. Я бы дважды проверил ваши маршруты, мои настроены следующим образом:

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

Порядок маршрутов будет влиять на то, какой из них попадет, если бы я поменял местами порядок моих нижних двух маршрутов, то другое действие получило бы название

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...