2014-01-16 6 views
19

У меня есть два просмотра модели:Как передать модель частичного зрения

public class ParentViewModel 
    { 
     public Id { get; set; } 
     ..... 
     public ChildViewModel Child{ get; set; } 
    } 

public class ChildViewModel 
    { 
     public ChildId { get; set; } 
     ..... 
    } 

Контроллеры:

public ActionResult Index() 
     { 
      .... <some code> 
      return View("NewIndex", ParentViewModel); 
     } 

    [HttpPost] 
    public ActionResult PartialAction(ChildViewModel childView) 
    { 
     return RedirectToAction("Index"); 
    } 

и просмотры: Индекс

@model ParentViewModel 
.... 
@Html.Partial("_Partial", Model.Child) 

и _Partial

@model ChildViewModel 
... do some stuff with child model 

Когда я пытаюсь открыть страницу индекса Я получил ошибку:

Модельного элемент передается в словарь имеет типа «ParentViewModel», но этот словарь требует модель элемента типа «ChildViewModel».

Почему он пытается передать ParentViewModel вместо ChildViewModel. Что я делаю неправильно?

+2

При вызове является 'Model.Child 'null? Потому что второй parater 'Html.Partial' не должен быть« null »... Так что сделайте так, чтобы ваше свойство' Child' имело какое-то значение! – nemesv

+0

Фактически мой частичный вид предназначен только для функций AddObject, поэтому ChildViewModel требуется только для отправки данных контроллеру из PartialView. Так что noot необходимо передавать данные в Child от Index to Partial view – DarkNik

+1

Еще нужно передать в ChildViewModel вызов '@ Html.Partial'. Однако это может быть пустой объект: '@ Html.Partial (" _ Partial ", новый ChildViewModel())' ... – nemesv

ответ

22

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

@model ParentViewModel 
@Html.Partial("_Partial", Model.Child) 

Если Model.Child имеет нулевое значение, то Модель передается вместо Model.Child. Если будут случаи, когда второй параметр равен нулю, тогда вам нужно будет сначала проверить свой код и, возможно, передать инициализированный Child в качестве второго параметра. Что-то вроде этого

@Html.Partial("_Partial", new Child()) 
+0

Это сработало для меня. Спасибо. – Ciwan

+0

Борясь с этим навсегда, не понимая нулевого ребенка, вы получите ту же ошибку. Благодаря! –

13

Ответ, который должен передать пустой объект частично, как

@Html.Partial("_Partial", new ChildViewModel()) 
0

Вы можете вернуть PartialView("...") из Controller вместо этого, и называть действия с точки зрения индекса.

Контроллеры:

public ActionResult Index() 
{ 
    .... <some code> 
    return View("NewIndex", ParentViewModel); 
} 

public ActionResult Partial(ChildViewModel cvm) 
{ 
    var vm = cvm ?? new ChildViewModel(); //if cvm from the parent view is null, return new cvm 
    return PartialView("_Partial", vm) //return partial view 
} 

[HttpPost] 
public ActionResult PartialAction(ChildViewModel childView) 
{ 
    return RedirectToAction("Index"); 
} 

и указательным

@model ParentViewModel 
.... 
@Html.Action("Partial", Model.Child) 

В качестве альтернативы, вы можете инициализировать ParentViewModel в Index() общественного индекса ActionResult()

{ 
    .... <some code> 
    return View("NewIndex", new ParentViewModel{Child = new ChildViewModel}); 
} 
Смежные вопросы