Привязка модели MVC дает неверный результат при изменении типов данных параметра действия - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть класс модель и класс viewmodel на линиях, аналогичных классу модели (код приведен ниже) в приложении MVC.Существует представление, модель которого - viewmodel и его форма.Соответствующий метод действия для этой кнопки отправки формы имеет параметр действия в качестве класса viewmodel.С учетом этого сценария связывание модели работает нормально.Теперь, если я изменю тип данных метода Action с «viewmodel» на класс «Model», привязка Model не будет работать правильно, и правильные данные не будут получены на стороне сервера.Ниже приведены классы моделей -

public class Model
  {
     public int A { get; set; }
  }

public class ViewModel
    {
        public Model Model { get; set; }
    }

Просмотреть код файла ниже:

@model ViewModel
@{
    ViewBag.Title = "Test";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Create</h2>

@using (Html.BeginForm("A", "Customers"))
{
    <div class="form-group">

        @Html.LabelFor(m => m.Model.A)
        @Html.TextBoxFor(m => m.Model.A, new { @class="form-control" })

    </div>

    <button type="submit" class="btn btn-primary">Save</button>
}

Метод действия контроллера: При правильном поведении привязки модели -

public ActionResult A(ViewModel model)
        {
            return Content("Value of A is " + model.Model.A); 
        }

Еслия изменяю параметр действия на класс модели, поведение привязки модели не происходит.Ниже приведен код -

public ActionResult A(Model model)
        {
            return Content("Value of A is " + model.A); 
        }

Почему это так?

На стороне браузера данные формы имеют вид - Model.A - 1 Почему это значение не может быть привязано к параметру класса модели A во втором упомянутом случае?

1 Ответ

0 голосов
/ 26 сентября 2018

Поскольку ваше представление связано с классом ViewModel (привязка модели), поэтому оно переносит ту же модель в событии post на сервер.но в случае, если вы хотите связать с какой-либо другой моделью, вы должны сформировать новую модель на стороне клиента, такую ​​как модель на стороне сервера.

В вашем случае для достижения того, что вы ищете, следуйте приведенному ниже коду:

 <input type="button" value="Save" onclick="SaveData()"/>

<script>
    function SaveData() {
        $.ajax({
            url: "/Home/Save",
            dataType: "json",
            type: "Post",
            data: {
               model:{A:10}
            },
            success:function(data) {

            }
        });
    }

</script>

Пожалуйста, сохраняйте одинаковое имя переменной на стороне клиента и сервера.

public ActionResult Save(Model model)
    {
        return Content("Value of A is " + model.A);
    }
...