MVC3 передает базовый класс частичному представлению - форма отправки имеет только значения родительского класса - PullRequest
3 голосов
/ 07 июня 2011

У меня есть несколько дочерних классов ViewModel, которые наследуются от базового класса ViewModel.

Я передаю свой дочерний ViewModel в свой View, который затем переходит в частичное представление.Основное представление принимает дочерний тип, а частичное - родительский.

Все отображается правильно, когда я вручную заполняю свойства.Однако, когда я отправляю форму, у моего действия контроллера есть только свойства для дочернего класса - ни одно из свойств базового класса не завершено?

например,

public abstract class BaseDetails
    {
        public string Name { get; set; }

        public BaseDetails()
        { }

        public BaseDetails(string name)
        {
            Name = name;
        }
    }

    public class LocalDetails:BaseDetails
    {
        public int Visits { get; set; }

        public LocalDetails()
        { }

        public LocalDetails(int visits, string name)
            :base(name)
        {
            Visits = visits;
        }
    }

При простом представлении:

@using (Html.BeginForm())
{
    @Html.TextBoxFor(m => m.Visits)
    <br />
    @Html.Partial("Name", Model)
    <input id="Submit1" type="submit" value="submit" />
}

Частичное представление содержит одно текстовое поле.

В IE: ViewSource показывает, что тег формы находится вокруг обоих tetxboxes.

Однако, когда я подчиняюсь методу контроллера:

[HttpPost]
public ActionResult EditLocal (LocalDetails model)

model.Visits заполнен правильно, но model.Name пусто?

Есть идеи?Я добавил конструкторы без параметров, потому что я получил исключение при отправке, если я этого не сделал.

1 Ответ

7 голосов
/ 07 июня 2011

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

Модель:

public abstract class BaseDetails
{
    public string Name { get; set; }
}

public class LocalDetails : BaseDetails
{
    public int Visits { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new LocalDetails());
    }

    [HttpPost]
    public ActionResult Index(LocalDetails model)
    {
        return View(model);
    }
}

Просмотр (~/Views/Home/Index.cshtml):

@model LocalDetails
@using (Html.BeginForm())
{
    @Html.TextBoxFor(m => m.Visits)
    <br />
    @Html.Partial("Name", Model)
    <input type="submit" value="submit" />
}

Частично (~/Views/Home/Name.cshtml):

@model BaseDetails
@Html.TextBoxFor(x => x.Name)

Когда я отправляюформа внутри действия POST Index и свойства модели Name и Visits правильно связаны со значениями из формы.

...