Свойства ASP.net MVC ViewModel являются нулевыми после отправки формы - PullRequest
0 голосов
/ 07 декабря 2018

Перед отправкой этого вопроса я много искал, и для каждого прочитанного вопроса либо ситуация была неодинаковой, либо ответ не работал для меня.

Как видно из названия, у меня есть MVC ViewModel как таковой:

public class RetrieveTestResultsViewModel
{
    [DisplayName("نام کاربری")]
    [Required(ErrorMessage = "لطفا نام کاربری را وارد کنید")]
    public string UserId { get; set; }

    [DisplayName("شماره تلفن")]
    [Required(ErrorMessage = "لطفا شماره تلفن را وارد کنید")]
    [StringLength(11, ErrorMessage = "شماره تلفن باید 11 رقمی باشد", MinimumLength = 11)]
    [RegularExpression(@"^0[0-9]+$", ErrorMessage = "شماره تلفن صحیح نیست")]
    public string PhoneNumber { get; set; }


}

Я убедился, что все свойства являются общедоступными и имеют примитивный тип (строка).

Затем внутри формы CSHTML :

@using (Html.BeginForm("Retrieve", "Home", FormMethod.Post, new { role = "form", autocomplete = "off", id = "newsletterForm", enctype = "multipart/form-data" }))
            {

                <div class="row">

                    @*username*@
                    <div class="col-sm-5">
                        <div class="form-control-custom">
                            @Html.NoAutoCompleteTextBoxFor(model => model.UserId, "input-lg font-size-sm mr-md formal", "نام کاربری *")
                            @Html.ValidationMessageFor(model => model.UserId, "", new { @class = "text-danger" })
                        </div>
                    </div>


                    @*phone number*@
                    <div class="col-sm-4">
                        <div class="form-control-custom">
                            @Html.NoAutoCompleteTextBoxFor(model => model.PhoneNumber, "input-lg font-size-sm mr-md formal", "شماره تلفن *")
                        </div>
                    </div>


                    <div class="col-sm-3">
                        <button type="button" autocomplete="off"
                                onclick="AjaxForm.CustomSubmit(this, 'newsletterForm')"
                                data-loading-text="در حال ارسال اطلاعات"
                                class="btn btn-primary btn-lg btn-block font-size-sm text-uppercase mt-sm formal">
                            دریافت نتایج
                        </button>
                    </div>
                </div>
            }

Обратите внимание, что пользовательский метод NoAutoCompleteTextBoxFor хорошо протестирован в других проектах и ​​имеет следующий вид:

public static MvcHtmlString NoAutoCompleteTextBoxFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        return html.TextBoxFor(expression, new { @class = "form-control", autocomplete = "off" });
    }

Такжев верхней части моего CSHTML я объявил модель:

@model VH.ViewModel.TestResults.RetrieveTestResultsViewModel

Внутри моего Домашнего контроллера есть Метод получения POST :

    [HttpPost]
    public ActionResult Retrieve(RetrieveTestResultsViewModel viewModel)
    {
        // viewModel.UserId -> null
        // viewModel.PhoneNumber -> null 
    }

Как вы видите, внутри метода Retrieve я ставлю точку останова и вижу, что ни один из моих входов не привязан к viewModel!

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Я не могу в это поверить.

Я изменил идентификатор формы на что-то другое, и это сработало!

Если кто-то может догадаться, что случилось, пожалуйста, напишите ответ.

0 голосов
/ 07 декабря 2018

Вы использовали multipart / form-data для enctype вашей формы.Вы можете использовать его, когда хотите загрузить некоторые файлы в свое действие.Но вы должны украсить свой параметр действия атрибутом [FormData] .Это скажет MVC , что ваша модель должна быть сделана из входных данных формы.
Вы можете удалить атрибут enctype или использовать атрибут FormData .

public ActionResult Retrieve(
     [FormData] RetrieveTestResultsViewModel viewModel)
{

}

Счастливого кодирования!

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