Ajax.beginform отправляет нулевые значения в контроллер - PullRequest
0 голосов
/ 01 марта 2019

Я немного искал, но пока не нашел ответа .. У меня есть частичное представление с формой:

@model PetDate.Models.ProfileDataModel

@using (Ajax.BeginForm("UpdateProfileInfo", "Profile", new AjaxOptions { HttpMethod = "Post", OnFailure = "", OnSuccess = "" }))
{
    <div class="form-group">
        @Html.LabelFor(x => x.FullName, new { @class = "text-info" })
        @Html.TextBoxFor(x => x.FullName, new { @class = "form-control" })
    </div>
    <div class="form-group">
        @Html.LabelFor(x => x.Email, new { @class = "text-info" })
        @Html.TextBoxFor(x => x.Email, new { @class = "form-control", @type = "email" })
    </div>
    <div class="form-group">
        @Html.LabelFor(x => x.BirthDay, new { @class = "text-info" })
        @Html.TextBoxFor(x => x.BirthDay, new { @class = "form-control", @type = "datetime" })
    </div>
    <div class="form-group">
        @Html.LabelFor(x => x.Username, new { @class = "text-info" })
        @Html.TextBoxFor(x => x.Username, new { @class = "form-control" })
    </div>
    <div class="form-group">
        @Html.LabelFor(x => x.AddressText, new { @class = "text-info" })
        @Html.TextBoxFor(x => x.AddressText, new { @class = "form-control", @id = "adresse" })


        @Html.HiddenFor(x => x.Postal, new { @id = "postalAddress" })
        @Html.HiddenFor(x => x.Street, new { @id = "streetAddress" })
        @Html.HiddenFor(x => x.HouseNumber, new { @id = "houseNumberAddress" })
        @Html.HiddenFor(x => x.story, new { @id = "storyAddress" })
        @Html.HiddenFor(x => x.roomPlacement, new { @id = "roomPlacementAddress" })

    </div>
    <div class="form-group">
        @Html.LabelFor(x => x.Description, new { @class = "text-info" })
        @Html.TextAreaFor(x => x.Description, new { @class = "initTinyMCE" })
    </div>
    <div class="form-group">
        <button type="submit" class="btn btn-outline-warning btn-lg" >Opdatér information</button>
    </div>
}

Эта форма отправляет сообщения на мой контроллер, но когда я смотрю на то, что яполучить в контроллере, все значения имеют значение null.

Мой контроллер:

namespace PetDate.Controllers
{
    public class ProfileController : MasterController
    {

        [ValidateInput(false)]
        [HttpPost]
        public ActionResult UpdateProfileInfo(ProfileDataModel data)
        {
            int ownerID = Convert.ToInt32(Session["userID"]);
            if (ModelState.IsValid)
            {
                using (var context = new ModelContainer())
                {
                    var ownerProfile = context.Owners.Where(x => x.ID == ownerID).FirstOrDefault();
                    var ownerLogin = context.Logins.Where(x => x.Owner_ID == ownerID).FirstOrDefault();

                    Address ownerAddress = null;

                    if (data.story != 0 && data.roomPlacement != string.Empty)
                    {
                        ownerAddress = context.Addresses.Where(x => x.Postal == data.Postal && x.Street == data.Street && x.Housenumber == Convert.ToInt32(data.HouseNumber) && x.Story == Convert.ToInt32(data.story) && x.Door == data.roomPlacement).FirstOrDefault();
                    }
                    else { 
                        ownerAddress = context.Addresses.Where(x => x.Postal == data.Postal && x.Street == data.Street && x.Housenumber == Convert.ToInt32(data.HouseNumber)).FirstOrDefault();
                    }


                    if (ownerProfile != null && ownerLogin != null)
                    {
                        // update content.
                        ownerProfile.FullName = data.FullName;
                        ownerProfile.Email = data.Email;
                        ownerProfile.Birthday = data.BirthDay;
                        ownerProfile.Description = data.Description;
                        ownerProfile.ProfilePicture = data.ProfilePicture;
                        ownerLogin.UserName = data.Username;

                        if (ownerAddress != null)
                        {   // already created the address, just get the ID
                            ownerProfile.Address_FK = ownerAddress.ID;

                        }
                        else
                        {   // has not been created before, create new one.

                            var obj = new Address()
                            {
                                Postal = data.Postal,
                                Street = data.Street,
                                Housenumber = Convert.ToInt32(data.HouseNumber),
                                Story = data.story,
                                Door = data.roomPlacement != string.Empty ? data.roomPlacement : ""
                            };

                        }


                        context.SaveChanges();
                        return new HttpStatusCodeResult(200, "ok");
                    }
                    else
                    {
                        return new HttpStatusCodeResult(400, "failure");
                    }
                }
            }
            else
            {
                return new HttpStatusCodeResult(400, "failure");
            }
        }
    }
}

Переменная Data, имеет нулевые значения.У меня есть почти похожая форма и контроллер, который обрабатывает некоторые другие вещи, которые прекрасно работают ...

Так что я немного растерялся, потому что возвращаемые значения просто нулевые ...

Моя модель, если интересно:

public class ProfileDataModel
    {
        [Required]
        public string FullName { get; internal set; }
        [Required]
        public DateTime? BirthDay { get; internal set; }
        [Required]
        public string Description { get; internal set; }
        [Required]
        public string Email { get; internal set; }
        [Required]
        public string AddressText { get; internal set; }
        [Required]
        public string Postal { get; set; }
        [Required]
        public string Street { get; set; }
        [Required]
        public int HouseNumber { get; set; }
        public int story { get; set; }
        public string roomPlacement { get; set; }
        [Required]
        public string ProfilePicture { get; internal set; }
        [Required]
        public string Username { get; internal set; }
        public string Password { get; set; }
    }

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Привязка модели не работает с DefaultModelBinder, потому что вы используете internal установить аксессор с public получить аксессор в некоторых свойствах, таких как:

public string FullName { get; internal set; }

Вышеприведенные определения означают:

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

Поскольку DefaultModelBinder использует отражение для выполнения чтения и записи значения в внутреннее поле свойства (вы можете увидеть в его определение ), должны быть установлены как методы доступа get, так и set.public, чтобы включить двустороннюю привязку модели с автоматическими свойствами.

Следовательно, все свойства внутри класса viewmodel должны иметь методы доступа get и set, определенные как public, чтобы позволить значениям свойств, назначенным из помощников HTML внутри представления:

public string FullName { get; set; }
0 голосов
/ 01 марта 2019

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

изменение

 public string FullName { get; internal set; }

на

 public string FullName { get; set; }

должно решить вашу проблему

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