MVC3 Строго типизированная привязка модели частичного представления - PullRequest
3 голосов
/ 22 июля 2011

У меня строго типизированное представление Edit с моделью с именем OrderModel. В этом представлении я использую строго типизированное частичное представление с моделью с именем OrderTypeModel. Частичное представление _OrderTypeAutoComplete, которое содержит текстовое поле автозаполнения jqueryui. Если я отрисовываю представление с этим кодом,

public ActionResult Edit(){
    return View();
}

В представлении «Мои правки» содержится следующая разметка Razor

<div class="editor-field">
    @Html.Partial("_OrderTypeAutoComplete")
    @Html.HiddenFor(model => model.OrderTypeID)
    @Html.ValidationMessageFor(m => m.OrderTypeID)
</div>

Мой частичный вид содержит эту разметку бритвы

@{
    Layout = null;
}
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.11.min.js")" type="text/javascript"></script>
@Html.AutoCompleteFor(model => model.OrderTypeID, x =>  x.OrderType, "Items","Orders")

Когда я отрисовываю это, все отлично, и мое автозаполнение прекрасно работает (с использованием расширения автозаполнения). В любом случае, мне нужно было что-то инициализировать в моей первоначальной OrderModel, поэтому я изменил код в моем контроллере на этот.

public ActionResult Edit(){
    return View(OrderService.GetInitializedOrderModel()); //returns a new OrderModel
}

Теперь, когда я отображаю представление, я получаю исключение: Элемент модели, передаваемый в словарь, имеет тип 'Testing.Models.OrderModel', но для этого словаря требуется элемент модели типа 'Testing.Models.OrderTypeModel'.

на этой строчке, на мой взгляд @ Html.Partial ( "_ OrderTypeAutoComplete")

Кажется, движок Razor создаст OrderModel для представления и OrderTypeModel для частичного представления в порядке, когда я не предоставил OrderModel. Это даст те же результаты.

public ActionResult Edit(){
    return View(new OrderModel())
}

Я новичок в MVC, поэтому я не уверен, что здесь происходит. Я просто пытаюсь предоставить несколько простых выпадающих значений для моего представления в модели OrderModel, которые достаточно малы, чтобы мне не требовался постбэк jquery для получения. Это значения, которые я инициализирую в своей модели для действия Http Get on my Edit.

Любая помощь будет принята с благодарностью. Спасибо.

1 Ответ

13 голосов
/ 22 сентября 2011

Определения классов для классов вашей модели отсутствуют в примере, поэтому я не могу точно сказать, что происходит, но ...

Метод @Html.Partial () имеет несколько перегрузок:

@Html.Partial(string)
@Html.Partial(string, Object)
@Html.Partial(string, ViewDataDictionary)
@Html.Partial(string, Object, ViewDataDictionary)

Первые три перегрузки - это всего лишь "псевдонимы" для последнего - когда все сказано и сделано, это последний, который вызывается.

Когда вы вызываете @Html.Partial(string) и не передаете значение модели или ViewDataDictionary, ASP.NET MVC просто передает ViewDataDictionary для текущего представления (то есть this.ViewData).

Другими словами, вызов:

@Html.Partial(string)

по существу эквивалентен:

@Html.Partial(string, this.ViewData)

... и в вашем случае, this.ViewData имеетвведите OrderModel, а не OrderModelType.

...