У меня возникли небольшие проблемы, и я думаю, что связыватель пользовательской модели - это то, что нужно.
Моя модель домена выглядит следующим образом, я имею в виду стандартную страницу и шаблон.Страница имеет шаблон в качестве ссылки.Так что по умолчанию asp.net mvc Binder, не знает, как его связать, поэтому мне нужно сделать некоторые правила для него.(Пользовательская привязка модели)
public class PageTemplate
{
public virtual string Title { get; set; }
public virtual string Content { get; set; }
public virtual DateTime? Created { get; set; }
public virtual DateTime? Modified { get; set; }
}
public class Page
{
public virtual string Title { get; set; }
public virtual PageTemplate Template { get; set; }
public virtual string Content { get; set; }
public virtual DateTime? Created { get; set; }
public virtual DateTime? Modified { get; set; }
}
Итак, я зарегистрировал ModelBinder в globals.asax
ModelBinders.Binders.Add(typeof(Cms.Domain.Entities.Page),
new Cms.UI.Web.App.ModelBinders.PageModelBinder(
new Services.GenericApplicationService<Cms.Domain.Entities.Page>().GetEntityStore()
)
);
Моя страница ModelBinder содержит пареметр, ведь мой репозиторий - это место, где я получаю все свои сущности(Страница, Шаблон)
Мой Контроллер для Страницы выглядит следующим образом.Я разместил в Create Controler, на данный момент это не имеет значения, если это был метод обновления.Так как в этом случае у меня есть раскрывающийся список, представляющий шаблон, я получу идентификатор в своей коллекции форм.
Затем я вызову: TryUpdateModel, и я получил удар по моему PageModelBinder.
[AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken]
[ValidateInput(false)]
public ActionResult Create(FormCollection form)
{
Page o = new Page();
string[] exclude = new { "Id" }
if (base.TryUpdateModel<Page>(o, string.Empty, null, exclude, form.ToValueProvider()))
{
if (ModelState.IsValid)
{
this.PageService.Add(o);
this.CmsViewData.PageList = this.PageService.List();
this.CmsViewData.Messages.AddMessage("Page is updated.", MessageTypes.Succes);
return View("List", this.CmsViewData);
}
}
return View("New", this.CmsViewData);
}
Итак, я заканчиваю работу с моделью Binder.У меня есть поиск в интернете для информации, но я на складе.
Мне нужно получить идентификатор из коллекции FormCollection и проанализировать его в Model из моего IEntityStore.Но как ?
public class PageModelBinder : IModelBinder
{
public readonly IEntityStore RepositoryResolver;
public PageModelBinder(IEntityStore repositoryResolver)
{
this.RepositoryResolver = repositoryResolver;
}
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException("bindingContext");
}
if (modelType == typeof(Cms.Domain.Entities.Page))
{
// Do some magic
// Get the Id from Property and bind it to model, how ??
}
}
}
// Деннис
Надеюсь, мой проблом ясен.