Просмотр данных от просмотра к контроллеру - PullRequest
2 голосов
/ 13 мая 2011

Есть ли простой способ передать объект из моего вида в контроллер?

Я пытался ViewData["newPerson"], но это не сработало.

Session["newPerson"] работает, но есть другиеспособы, которые более рекомендуются?

Ответы [ 5 ]

3 голосов
/ 13 мая 2011

Обычно вы получите модель в качестве параметра.Вы должны иметь поля формы, которые сопоставляются со свойствами модели.

public class PersonViewModel
{
     [Required]
     public string FirstName { get; set; }

     [Required]
     public string LastName { get; set; }
     ...
}

Затем в вашем представлении:

@model PersonViewModel
@using (Html.BeginForm())
{
      <div class="editor-label">@Html.LabelFor( model => model.FirstName )</div>
      <div class="editor-field">@Html.EditorFor( model => model.FirstName )</div>

      <div class="editor-label">@Html.LabelFor( model => model.LastName )</div>
      <div class="editor-field">@Html.EditorFor( model => model.LastName )</div>
      ...
}

Затем в действиях, соответствующих представлению, отправьте и получитемодель

[HttpGet]
public ActionResult CreatePerson()
{
     return View( new Person() );
}

[HttpPost]
public ActionResult CreatePerson( PersonViewModel person )
{
    var person = ...create and persist a Person entity based on the view model....
    return Redirect("details", new { id = person.id } );
}
1 голос
/ 13 мая 2011

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

Например, это передаст значение 3 в качестве параметра id в ваше действие (с использованием логики маршрута)

@Html.ActionLink("Home", "Details", new { id = 3 });
0 голосов
/ 19 февраля 2013

Исходя из принятого ответа, мой ответ - не то, что вы ищете, но исходя из Google (на момент написания), этот ответ SO наиболее отзывчив на фактическую передачу данных изВид на контроллер.

Если вы установите значение на WebViewPage<T>.ViewContext.ViewData, оно может быть доступно с контроллера.Мы используем эту технику, чтобы установить тему письма в виде, который мы представляем как тело письма в формате HTML.(Этот подход позволяет нам объединить определение предмета с телом электронного письма и получить доступ к этому предмету из контроллера, куда мы фактически отправляем электронное письмо.)

/// <summary>
/// Sends a system email containing a rendered view.
/// </summary>
public static void SendSystemEmailOfView(this Controller controller, string to, [AspMvcView] string viewName, object model, ViewDataDictionary viewData = null)
{
    if (viewData == null)
    {
        viewData = new ViewDataDictionary();
    }

    var body = controller.Render(viewName, model, viewData);
    object subject;
    if (viewData.TryGetValue(WebViewPageExtensions.ViewDataKey_EmailSubject, out subject))
    {
        subject = subject as string;
    }
    if (subject == null)
    {
        subject = DefaultEmailSubject;
    }
    SendEmail(to, (string)subject, body, isHtml: true);
}

Примечания: 1) AspMvcViewAttribute это аннотация Resharper, которую вы можете опустить, если не используете Resharper.2) controller.Render и SendEmail являются внешними методами (существует много ответов SO о том, как отправлять электронные письма и как вручную отображать представление в строке из контроллера.)

Наше представление выглядит следующим образом:

@model MyViewModel
@{
    this.EmailSubject("Subject Here");
}
<p>
    Dear Web Forms,
</p>

<p>
    I'm leaving you for MVC...it's just so much more...DRY.
</p>

и .EmailSubject выглядит так:

public const string ViewDataKey_EmailSubject = "MyAppName_EmailSubject";

/// <summary>
/// Sets an email subject in <paramref name="page"/>'s  <see cref="WebViewPage{T}.ViewBag"/>.  Useful for retrieving the subject from controller.
/// </summary>
public static void EmailSubject<T>(this WebViewPage<T> page, string subject)
{
    // Must set value on ViewContext's ViewData if we want to access it after view renders; page.ViewData setter copies the ViewDataDictionary.
    page.ViewContext.ViewData[ViewDataKey_EmailSubject] = subject;
}
0 голосов
/ 13 мая 2011

Реализуете ли вы форму?Лучше всего было бы создать на вашем контроллере новое действие, которое принимает ваш объект.У вашего контроллера будет такой метод:

public ActionResult MyAction(Person person)
{
    // your code
}

Или, если вы хотите, чтобы он отвечал на сообщения:

[HttpPost]
public ActionResult MyAction(Person person)
{
    // your code
}

Тогда ваше представление будет вызывать действие вашего контроллера через ссылку илиФорма отправки.Один пример для ссылки:

@Html.ActionLink("MyContoller", "MyAction", newPerson);
0 голосов
/ 13 мая 2011

У меня сложилось впечатление, что вы объявляете, что ваш обработчик принимает параметр типа FormCollection.Это может быть проиндексировано текстом вашей переменной для получения значения.Следите за опечатками - попытка получить несуществующее значение просто возвращает пробел.

...