Id未发布在ASP.NET MVC中

Kri*_*s-I 1 nhibernate asp.net-mvc

当我发布我的模型时,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
Run Code Online (Sandbox Code Playgroud)

在控制器中,我设置了模型:

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

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

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

    return PartialView("Contact", model);
}
Run Code Online (Sandbox Code Playgroud)

在视图中,我这样做:

@Html.HiddenFor(m => m.Contact.Id) (当我用TextBoxFor替换时,我看到了正确的值)

当我发布表单时,在控制器中所有值都在模型中,但Contact.Id始终为0

我这样发帖:

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

在控制器中:

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

任何的想法 ?

谢谢,

Dar*_*rov 5

您需要id属性的公共setter:

public virtual TId Id { get; set; }
Run Code Online (Sandbox Code Playgroud)

否则,您如何期望默认模型绑定器能够设置其值?哦,顺便说一下,为什么你应该在视图中使用视图模型而不是域对象,这是10 ^ 10 + 1的原因之一.

所以这是一个更现实的MyModel的样子:

public class MyViewModel
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这就是你应该传递给视图的东西,这就是你应该获得的回报.其余的是在此视图模型和您的实际域对象之间进行映射.使用AutoMapper等工具可以大大简化这种映射.这样您就可以按原样保留域,并根据设计给定视图的特定要求定制视图模型.