有没有办法在C之前强制绑定属性A和B?
System.ComponentModel.DataAnnotations.DisplayAttribute类中有Order属性,但它是否会影响绑定顺序?
我想要实现的是
page.Path = page.Parent.Path + "/" + page.Slug
在自定义的ModelBinder中
答案 0 :(得分:1)
为什么不将Page属性实现为:
public string Path{
get { return string.Format("{0}/{1}", Parent.Path, Slug); }
}
答案 1 :(得分:0)
我最初会推荐Sams回答,因为它根本不涉及Path属性的任何绑定。您提到可以使用Path属性连接值,因为这会导致延迟加载。因此,我想您正在使用域模型向视图显示信息。因此,我建议使用视图模型仅显示视图中所需的信息(然后使用Sams回答来检索路径),然后使用工具将视图模型映射到域模型(即AutoMapper)。
但是,如果继续在视图中使用现有模型,并且无法使用模型中的其他值,则可以将path属性设置为自定义模型绑定器中的表单值提供程序提供的值。已发生绑定(假设不对路径属性执行验证)。
所以我们假设你有以下观点:
@using (Html.BeginForm())
{
<p>Parent Path: @Html.EditorFor(m => m.ParentPath)</p>
<p>Slug: @Html.EditorFor(m => m.Slug)</p>
<input type="submit" value="submit" />
}
以下视图模型(或视情况而定的域模型):
公共类IndexViewModel { public string ParentPath {get;组; } public string Slug {get;组; } public string Path {get;组; } }
然后,您可以指定以下模型装订器:
public class IndexViewModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
//Note: Model binding of the other values will have already occurred when this method is called.
string parentPath = bindingContext.ValueProvider.GetValue("ParentPath").AttemptedValue;
string slug = bindingContext.ValueProvider.GetValue("Slug").AttemptedValue;
if (!string.IsNullOrEmpty(parentPath) && !string.IsNullOrEmpty(slug))
{
IndexViewModel model = (IndexViewModel)bindingContext.Model;
model.Path = bindingContext.ValueProvider.GetValue("ParentPath").AttemptedValue + "/" + bindingContext.ValueProvider.GetValue("Slug").AttemptedValue;
}
}
}
最后指定在视图模型上使用以下属性来使用此模型绑定器:
[ModelBinder(typeof(IndexViewModelBinder))]