Идентификатор не размещен в ASP.NET MVC - PullRequest
1 голос
/ 23 июня 2011

Когда я публикую свою модель, Id отсутствует:

У меня есть модель базы данных NHibernate "Контакт":

       public class Contact : Entity<int>
        {
            public virtual string LastName { get; set; }
            public virtual string FirstName { get; set; }
        }

        public abstract class Entity<TId>
        {
            public virtual TId Id { get; protected set; }

            public override bool Equals(object obj)
            {
                return Equals(obj as Entity<TId>);
            }
        }

I

n на контроллере, я устанавливаю модель:

    public class MyModel
    {
        public Contact Contact { get; set; }
    }

public ActionResult MyController()
{
    MyModel model = new MyModel();

    model.Contact = ... //come from DB

    return PartialView("Contact", model);
}

В представлении я делаю это:

@Html.HiddenFor(m => m.Contact.Id) (когда я заменяю TextBoxFor, я вижу правильное значение)

Когда я публикую форму,в контроллере все значения в модели, но Contact.Id все время равен 0

Я пишу так:

var jqxhr = $.post("Controller/MyAction", $("form").serialize(),
    function (data) {
    });

В контроллере:

[HttpPost]
public ActionResult MyAction(MyModel model)
{
    //model.Contact.Id equal 0 all the time
    //other value (fields) are ok.
}

Есть идеи?

Спасибо,

Ответы [ 3 ]

5 голосов
/ 23 июня 2011

Вам нужен общедоступный установщик для свойства id:

public virtual TId Id { get; set; }

В противном случае, как вы ожидаете, что механизм связывания модели по умолчанию сможет установить его значение?Да, и кстати, это одна из 10 ^ 10 + 1 причин, почему вы должны использовать модели представлений в ваших представлениях вместо объектов вашего домена.

Так вот как выглядит более реалистичная MyModel:*

public class MyViewModel
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Это то, что вы должны передать представлению, и это то, что вы должны получить взамен.Остальное сопоставление между этой моделью представления и вашими фактическими объектами домена.Это отображение может быть значительно упрощено с помощью таких инструментов, как AutoMapper .Таким образом вы оставляете свой домен как есть и настраиваете модели представления в соответствии с конкретными требованиями данных представлений, для которых они предназначены.

2 голосов
/ 23 июня 2011

Ваш идентификатор private set. Вот почему связыватель модели не может установить значение. Вы должны изменить его на публичный сеттер:

public virtual TId Id { get; set; }
1 голос
/ 23 июня 2011

Защищенный набор для идентификатора.

MVC выполняет следующие действия:

  1. new Object ()
  2. Установка значений из формы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...