Как сохранить состояние типизированных объектов модели представления в частичных представлениях? - PullRequest
1 голос
/ 03 июля 2011

Привет

У меня строго типизированное представление в ASP.NET MVC. Чтобы отслеживать свойства модели, когда они не связаны с полем (например, TextBoxFor), мне нужно будет использовать элемент HTML.HiddenFor. Это позволяет легко манипулировать данными и возвращать их на сервер.

Скажем теперь, что мой строго типизированный вид содержит частичный вид, где я предоставляю немного своей модели из основного вида, например:

<% Html.RenderPartial("~/Views/Ad/Partial/ListSettings.ascx", Model.ALS); %>

Весь javascript для чтения и манипулирования свойством ALS (сложным объектом) помещен в частичное представление, чтобы быть способным использовать частичное представление в других основных видах.

В этом частичном представлении у меня также есть следующие строки:

<%: Html.HiddenFor(c => c.CP) %>
<%: Html.HiddenFor(c => c.L) %>
<%: Html.HiddenFor(c => c.OB) %>
<%: Html.HiddenFor(c => c.ST)%>
<%: Html.HiddenFor(c => c.P)%>

И это прекрасно работает при чтении через javascript, но при отправке представления настройки этих свойств не будут возвращаться сервису?

Я попытался разместить их на главном экране, как показано ниже:

<%: Html.HiddenFor(c => c.ALS.CP) %>
<%: Html.HiddenFor(c => c.ALS.L) %>
<%: Html.HiddenFor(c => c.ALS.OB) %>
<%: Html.HiddenFor(c => c.ALS.ST)%>
<%: Html.HiddenFor(c => c.ALS.P)%>

И укажите javascript на правильные поля, но даже если это сработает, проблема в том, что частичное представление не будет содержать всего, что ему нужно, мне придется реализовать эти скрытые поля в каждом главном представлении, в котором размещено частичное представление?

Как с этим справиться?

BestRegards

1 Ответ

2 голосов
/ 03 июля 2011

Если все эти поля не подлежат изменению пользователем, вы можете просто включить скрытое поле, содержащее некоторый идентификатор, который позволит вам извлечь их из источника данных.Например:

<%= Html.HiddenFor(x => x.Id) %>

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

[HttpPost]
public ActionResult Foo(int id)
{
    var model = _repository.Get(id);
    ...
}

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

...