asp.net 从视图到控制器查看数据

olhwl3o2  于 2023-10-21  发布在  .NET
关注(0)|答案(6)|浏览(156)

有没有一种简单的方法将一个对象从我的视图传递到控制器?
我试过ViewData["newPerson"],但没有用。
Session["newPerson"]可以工作,但有其他更推荐的方法吗?

ujv3wf0j

ujv3wf0j1#

通常你会收到一个模型作为参数。您必须有Map到模型属性的表单字段。

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 } );
}
ni65a41a

ni65a41a2#

除了调用控制器的操作之外,您不应该希望将对象从视图传递到控制器。如果你试图传递一个参数给你的控制器动作,你可以添加一个路由值。
例如,这将把值3作为id参数传递到您的操作中(使用路由逻辑)

@Html.ActionLink("Home", "Details", new { id = 3 });
ukqbszuj

ukqbszuj3#

你是在实现一种形式吗?你最好的办法是在你的控制器上创建一个新的动作来接收你的对象。你的控制器会有这样一个方法:

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

或者如果你想让它回复帖子:

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

然后你的视图会通过一个链接或者一个表单提交来调用你的控制器动作。一个链接的例子:

@Html.ActionLink("MyContoller", "MyAction", newPerson);
izkcnapc

izkcnapc4#

我的印象是,您声明了处理程序以接受FormCollection类型的参数。可以通过变量的文本进行索引以检索值。注意打字错误--尝试检索不存在的值只会返回空白。

3xiyfsfu

3xiyfsfu5#

基于公认的答案,我的答案不是你想要的,但是基于Google(在写这篇文章的时候),这是对实际从View向Controller传递数据最敏感的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.RenderSendEmail是外部方法(关于如何发送电子邮件以及如何从控制器中手动渲染视图到字符串,有很多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;
}
7eumitmz

7eumitmz6#

我可能来晚了一点,但我是这样做到的。所有你需要的是提到你的ViewData值作为控制器中的参数。具体操作如下:

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

相关问题