2014-11-04 3 views
4

У меня есть два вида: частичный вид и представление, которое инкапсулирует частичный вид, используя @Html.RenderPartial("_PartialView"). Каждый из них имеет свою собственную ViewModel:Вложенные задачи ViewModels/Partial View в MVC

public class PartialViewModel 
{ 
    // properties, etc. 
} 

public class MainViewModel 
{ 
    public PartialViewModel p { get; set; } 
    // properties, etc. 
} 

я получаю ошибки словаря, когда я загрузить вторую точку зрения (тот, который использует MainViewModel), так как этот вид и частичный вид инкапсулирует используют два различных ViewModels. Я не могу заставить их использовать один и тот же ViewModel, потому что частичный вид отображается во многих других разных представлениях.

Должно быть ясно, both of these views contain forms, с частичным представлением, представляющим все общие поля между формами. Учитывая это, есть ли у меня какие-либо опции или я просто пытаюсь сделать что-то, что не соответствует ограничениям MVC?

ответ

3

вы захотите спроектировать это несколько иначе. Основной вид будет иметь модель - позволяет называть его MainModel, а парциальное View может иметь модель - мы будем называть его PartialModel

public class PartialModel 
{ 
    /// props 
} 

public class MainViewModel 
{ 
    public PartialModel Partial { get; set; } 
    // properties, etc. 

    // per comments in other answer you may want something like this 
    public MainViewModel() 
    { 
     Partial = new PartialModel(); 
    } 
} 

тогда ваш главный View будет

@model MainViewModel 

затем в середина главного вида у вас есть что-то вроде

@{ Html.RenderPartial("myPartialView", Model.Partial); } 

Обратите внимание на фигурные скобки вокруг Html.RenderPartial. Они необходимы, потому что RenderPartial return недействителен.

При визуализации частичного вида вы также можете пройти в модели к ней, если она разработана правильно, то модели, что частичные потребности уже будут, доступными из модели основного вида, в

+0

Я думаю, что это было то, чего мне не хватало - второй параметр '@ Html.RenderPartial'. Благодарю. – alex

+1

@alex. Для получения дополнительной информации, если вы не укажете модель при использовании 'RenderPartial' по умолчанию, она будет использовать основные представления' ViewDataDictionary', чтобы она передавала 'MainViewModel' частичную, но так как частичный ожидает' PartialViewModel' вы получаете ошибки. –

2

Вы можете сделать это , но в вашем контроллере вам нужно будет объявить новый MainViewModel и назначить его PartialViewModel новый PartialViewModel.

Ex:

public class Controller { 
    public ActionResult Index(){ 
     var mainViewModel = new MainViewModel { PartialViewModel = new PartialViewModel() }; 
     return View(mainViewModel); 
    } 
} 

Теперь, я бы делегировать создание этих моделей на заводе, но это более продвинутая и не нужно, пока вы не получите в рефакторинга.

+0

Почему это проголосовало? когда вы RenderPartial() вы не вызываете контроллер, вы просто прямо визуализируете представление, модель должна быть передана из представления. Вы должны указать, какая модель, как в моем ответе. Некоторые шаблоны проектирования всегда используют одну и ту же модель представления, и они огромны, если это так, то вы можете просто визуализировать партнерские контуры без специфики модели, и она будет использовать ту же модель из родительского представления. –

+0

@ScottSelby It * был * скорее всего upvoted, потому что если вы попытаетесь получить доступ к свойству модели подзадачи, которая не была инициализирована, вы получите исключение NullReferenceException, поскольку по умолчанию оно не будет инициализировано. –

+0

нет - он будет до тех пор, пока исходная модель запустит его. Весь этот код - это просто помощь, когда вы выполняете RedirectToAction («действие», «контроллер»), но не имеет ничего общего с @ Html.RenderPartial –