所有源码在 https://github.com/luqizheng/Qi4Net
看Demo
和一个持久化对象自动绑定
//持久化对象
//Qi4Net\src\Qi\MvcTest\Models\User.cs
public class User : DomainObject<Guid>
{
public string LoginId { get; set; }
public string Name { get; set; }
public string Password { get; set; }
public override int GetHashCode()
{
return (Name + Password).GetHashCode();
}
}
Post上来的数据会自动set到User里面,而且是自动匹配类型(其实就是NHibernate.Type.IType,提供的方法进行转换) 。NHibernateBinder会自动忽略只有Get的方法,另外IList,ISet是不支持的,因为不能简单地Clear and Add.所以只能靠手工了
//D:\GitQi\Qi4Net\src\Qi\MvcTest\Controllers\UserController.cs
[HttpPost,Session]
public ActionResult Edit([ModelBinder(typeof(NHModelBinder))]User user)
{
SessionManager.Instance.CurrentSession.SaveOrUpdate(user);
return RedirectToAction("Index");
}
第二种,持久化对象是某个对象的其中一个。
是ChangeUserPasswordModel,而不是ChangePasswordModel,不太严谨,请见谅。
//\Qi4Net\src\Qi\MvcTest\Models\ChangeUserPasswordModel.cs
public class ChangeUserPasswordModel
{
[Required]
public User User { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "New password")]
public string NewPassword { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm new password")]
[Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
View要做稍稍处理,用HiddenFor是不行的。我用了
@Html.Hidden("User", this.Model.User.Id),其中"User"和
ChangeUserPasswordModel.User 名称是一样的。
//Qi4Net\src\Qi\MvcTest\Views\User\ChangePassword.cshtml
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>ChangeUserPasswordModel</legend>
@*请留意这里*@
@Html.Hidden("User", this.Model.User.Id)
<div class="editor-label">
@Html.LabelFor(model => model.NewPassword)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.NewPassword)
@Html.ValidationMessageFor(model => model.NewPassword)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ConfirmPassword)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ConfirmPassword)
@Html.ValidationMessageFor(model => model.ConfirmPassword)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
NHModelBinder默认的情况下,是用Id进行查询的. 如果不是,那么就要对Model做一些处理,如
public class ChangeUserPasswordModel
{
[Required]
[Qi.Web.Mvc.NhModelFounder("LoginId",true)]
public User User { get; set; }
.....
}
假设User是使用LoginId进行查询的,那么就用NhModelFounderAttribute告诉NhModelBinder, 这个Property使用LoginId,进行查询的,后面的True告诉查询结构集合石唯一的,还是有多个,如果多个就用拿第一个。
当然也可以用 Hql,如:
[Required]
[NhModelFounder("From User u where u.Id=:User", "Guid")]
public User User { get; set; }
暂时如下,程序可能还有bug,请大家见谅。
posted @ 2012-02-02 14:45 沉默的糕点 阅读(106) 评论(0)
编辑