Id未发布在ASP.NET MVC中

时间:2011-06-22 20:55:07

标签: asp.net-mvc nhibernate

当我发布我的模型时,ID丢失了:

我有一个NHibernate数据库模型“Contact”:

       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

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

    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 个答案:

答案 0 :(得分:5)

您需要id属性的公共setter:

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等工具可以大大简化此映射。这样您就可以按原样保留域,并根据设计给定视图的特定要求定制视图模型。

答案 1 :(得分:2)

您的身份证明是private set。这就是模型绑定器无法设置值的原因。您应该将其更改为公共设置者:

public virtual TId Id { get; set; }

答案 2 :(得分:1)

身份上受保护的设置。

MVC执行以下操作:

  1. new Object()
  2. 从表单设置值。