ASP.NET MVC - вернуть параметры словаря - PullRequest
1 голос
/ 29 августа 2010

Хорошо, я пытаюсь передать словарь, где key = int и value = Prototype на мой взгляд.

Prototype:

public class Prototype     
{
    public string Value { get; set; }
    public string PropertyName { get; set; }
    public Options Type { get; set; }
}

После того, как словарь был пройденНа мой взгляд, я делаю цикл foreach для рендеринга каждого из KeyValuePair:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<Dictionary<System.Int32,MvcApplication1.Models.Prototype>>" %>
<%@ Import Namespace="SecuredFormExample.Code" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Index</title>
</head>
<body>
    <div>

    <% Html.BeginForm("Save", "Products", FormMethod.Post); %>

    <% foreach (KeyValuePair<int, Prototype> p in Model)
       { %>
       <%: Html.Label(p.Value.PropertyName) %>
       <%: Html.TextBox("Value") %>
       <% } %>
    <p><input type="submit" value="submit" /></p>

    <% Html.EndForm(); %>

    </div>
</body>
</html>

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

Ответы [ 3 ]

0 голосов
/ 30 августа 2010

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

MVC Futures показывает, где находится общий путь. Он имеет несколько расширений HtmlHelper для генерации скрытых полей и кодирования состояния объекта в эти поля. Конечно, у вас могут быть дополнительные требования, такие как защита от несанкционированного доступа и т. Д., Которые вы можете поместить поверх этих методов.

http://aspnet.codeplex.com/SourceControl/changeset/view/55373#338518

  • BinaryHtmlExtensions.cs
  • ExpressionInputExtensions.cs

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

0 голосов
/ 30 августа 2010

Варианты передачи невидимых значений с одной страницы на следующую в ASP.NET MVC: -

1) Скрытые поля (зашифрованные или иные)

2) Файлы cookie (скрыто или нет)

3) Параметры URL (закодированные или иным образом, ограниченный размер)

4) Состояние сеанса (заполнение его большими объектами обычно не очень хорошая идея)

5) TempData (аналогично состоянию сеанса, но длится всего один «цикл»)

6) База данных (укажите только ключ, чтобы вы могли получить данные на следующей странице)

Для этого примераЕсли ваши данные не слишком велики и вы не используете веб-ферму с балансировкой нагрузки, я бы порекомендовал TempData в качестве самого простого решения.(Если вы работаете в ферме с балансировкой нагрузки, вы все равно можете это сделать, но вам может потребоваться изменить способ обработки состояния сеанса).

0 голосов
/ 29 августа 2010

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

Если вас беспокоит вмешательство пользователей в скрытые поля, вы можете сериализовать и зашифровать целые объекты, используя Html.Serialize .


ОБНОВЛЕНИЕ:

Вот примерразверните мое второе предложение, которое должно было использовать идентификатор:

<% Html.BeginForm("Save", "Products", FormMethod.Post) { %>
    <%: Html.Hidden("id", "PUT AN ID HERE WHICH IDENTIFIES THE ITEM")
    <% foreach (KeyValuePair<int, Prototype> p in Model) { %>
       <%: Html.Label(p.Value.PropertyName) %>
       <%: Html.TextBox("Value") %>
    <% } %>
    <p><input type="submit" value="submit" /></p>
<% } %>

и в вашем действии контроллера:

public ActionResult Save(string id, ....) 
{
    var data = SomeRepository.FetchData(id);
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...