2015-02-24 1 views
0

У меня есть автозаполнение в виде частичного представления, которое я хотел бы использовать дважды на той же странице. Есть три модели, участвующихКак получить данные из двух вхождений одного и того же частичного представления с использованием модели класса encapsulting

public partial class CustomParent 
{ 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Int64 CustomParentId { get; set; } 

    public Geoname ParentGeoname { get; set; } 
    public Geoname ChildGeoname { get; set; } 

    public CustomParent() 
    { 
     ParentGeoname = new Geoname(); 
     ChildGeoname = new Geoname(); 
    } 
} 
public partial class Geoname 
{ 
    [Required] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Int64 GeonameId { get; set; } 
    public string Name { get; set; } 
} 
public partial class GeonameWithFilter 
{ 
    public GeonameWithFilter() 
    { 
     FilterString = ""; 
    } 
    public Geoname Geoname { get; set; } 
    public String FilterString { get; set; } 
} 

Я контроллер создан

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "CustomParentId,ParentGeoname,ChildGeoname")] CustomParent customParent) 
    {...} 

Я создал два парциальные Html на моем создать взгляд первоначально только с использованием моделей customparent и geoname и он работал отлично установив значения в родительском и дочернем geonames, как ожидалось. Теперь я требую, чтобы дополнительные параметры передавались в частичный вид, поэтому я создал класс инкапсуляции (GeonameWithFilter). Я внес изменения в мой частичном вид и на мои два html.partials на странице просмотра, которые сейчас выглядят следующим образом:

  @Html.Partial("_GeonameAutocomplete",new GeonameWithFilter(){Geoname = Model.ParentGeoname,FilterString="'featurecodes':'CUPA'"}, 
       new ViewDataDictionary() 
       { 
        TemplateInfo = new TemplateInfo() { HtmlFieldPrefix = "ParentGeoname" } 
       }) 
      @Html.Partial("_GeonameAutocomplete", new GeonameWithFilter() { Geoname = Model.ChildGeoname, FilterString = "'featurecodes':'ADM1,ADM2,ADM3,ADM4'" }, 
       new ViewDataDictionary() 
       { 
        TemplateInfo = new TemplateInfo() { HtmlFieldPrefix = "ChildGeoname" } 
       }) 

Проблема, что customparent.parentGeoname и customparent.childGeoname не теперь получают вернулись к моему контроллер. Я предполагаю, что это связано с тем, что модель частичного представления не является тем же классом, что и мои модели страниц parentGeoname и childGeoname, но не может работать или находить примеры того, как обращаться с таким обстоятельством, если это действительно возможно.

ответ

0

Ну, это заняло у меня большую часть дня, но теперь у меня есть то, что мне нужно.

Я отказался от инкапсуляции и вместо этого добавил мою базовую модель Geoname в новый ViewDataDictionary и аннулировал модель по умолчанию для Html.Partial.

Затем я добавил параметр filterstring в качестве ключа в новый ViewDataDictionary, который я использовал в качестве аргумента для объекта с моделью и TemplateInfo.

Большое спасибо https://stackoverflow.com/users/7714/craig-stuntz за его ответ на другой вопрос Shorthand for creating a ViewDataDictionary with both a model and ViewData items?, который указал мне в том направлении, в котором я ушел.

Мой автозапуск теперь просто использует @ViewData ["FilterString"] для доступа к параметрам фильтра. Инкапсуляция GeonameWithFilter больше не нужна. Мои два Html.Partials на моей странице просмотра выглядеть следующим образом:

  @Html.Partial("_GeonameAutocomplete", null, 
       new ViewDataDictionary(new ViewDataDictionary() { {"FilterString", "featurecodes:'CUPA'" }}) 
       { 
        Model = Model.ParentGeoname, 
        TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "ParentGeoname" } 
       }) 
      @Html.Partial("_GeonameAutocomplete", null, 
       new ViewDataDictionary(new ViewDataDictionary() { { "FilterString", "featurecodes:'ADM1,ADM2,ADM3,ADM4'" } }) 
       { 
        Model = Model.ChildGeoname, 
        TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "ChildGeoname" } 
       }) 

Если кто-нибудь знает лучший способ для достижения конечного результата, я все же хотел бы услышать.