当我发布我的模型时,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.
}
有什么想法吗?
谢谢,
答案 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执行以下操作: