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)
任何的想法 ?
谢谢,
您需要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等工具可以大大简化这种映射.这样您就可以按原样保留域,并根据设计给定视图的特定要求定制视图模型.
| 归档时间: |
|
| 查看次数: |
369 次 |
| 最近记录: |