Невозможно передать данные из представления в контроллер ASP. NET MVC 5 - PullRequest
0 голосов
/ 25 апреля 2020

Я использую ASP. net Приложение MVC5, и есть одна форма, позволяющая пользователю ввести свой номер телефона. Я получаю нулевое значение в контроллере, когда я отправляю форму.

вид:

@model PhoneNumberDto

@using (Html.BeginForm("PreTransfer", "Home", FormMethod.Post))
{
    <div>
        <div class="form-row">
            <div class="col">
                <div class="input-group text-dark border-dark">
                    <div class="input-group-prepend">
                        <span class="input-group-text">+</span> 
                    </div>
                    @Html.EditorFor(x => x.PhoneNumber,
                                    new {htmlAttributes = new {@class = "form-control", @type = "number", @inputmode = "tel", @style = "color: rgb(0, 0, 0); background-color: rgb(248, 248, 248)", @placeholder = "Country code and phone number "}})
                    <div class="input-group-append">
                        <button class="btn btn-outline-dark" type="submit" value="Save" style="color: rgb(0, 0, 0); background-color: rgb(248, 248, 248);">
                            <i class="fa fa-angle-double-right"></i>
                        </button>
                    </div>
                </div>
                @Html.ValidationMessageFor(model => model.PhoneNumber, "", new {@style = "color: red"})
            </div>
        </div>
    </div>
}

Контроллер:

[HttpGet]
public ActionResult Index()
{
    var viewModel = new PhoneNumberDto();
    return View(viewModel);
}

[HttpPost]
public ActionResult PreTransfer(PhoneNumberDto phoneNumber)
{
    if (!ModelState.IsValid)
    {
        var viewModel = phoneNumber;
        return View("Index", viewModel);
    }
}

Модель:

public class PhoneNumberDto
{
    [Required(ErrorMessage = "Number is required")]
    [RegularExpression(@"^(\d{10,12})$", ErrorMessage = "Please enter a correct number")]
    public string PhoneNumber { get; set; }
}

Ответы [ 3 ]

0 голосов
/ 26 апреля 2020

Я решил проблему, изменив phoneNumber на phoneNumberDto в методе PreTransfer в контроллере.

0 голосов
/ 26 апреля 2020

это связано с конфликтом имен. ASP. NET знает о PhoneNumber строковом свойстве в вашей форме и может сопоставить его с параметром string phoneNumber в методе publi c ActionResult PreTransfer(string phoneNumber).

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

[HttpPost]
public ActionResult PreTransfer(PhoneNumberDto model)
{
    if (!ModelState.IsValid)
    {
        return View("Index", model);
    }
}

Вот статья о двух способах передачи параметров из контроллера. Например, если у вас есть DTO с тремя параметрами, обе эти подписи верны:

[HttpPost]
public void FormOne(string textBoxStringData, int textBoxIntData, string checkboxData)
{
    //Do something
}

[HttpPost]
public void FormTwo(YourDto model)
{
    //Do something with formData
}
0 голосов
/ 26 апреля 2020

Подпись метода должна иметь phoneNumber в виде строки

public ActionResult PreTransfer(string phoneNumber)

в качестве альтернативы есть Request.Form("PhoneNumber"), который тоже должен работать.

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