【问题标题】:how to pass entire model (with data) from view to controller?如何将整个模型(带有数据)从视图传递到控制器?
【发布时间】:2014-05-30 20:17:16
【问题描述】:

我不知道,这可能是个愚蠢的问题,但现在我试图找到解决这个问题的方法。即使视图中没有使用某些模型属性,我也需要将整个模型信息(数据)返回给控制器。但我需要它们进行控制器操作。例如 id、标签值。

示例

 <div class="col-md-6">
        @Html.LabelFor(model => model.AbstractTitleInEnglishLabel, 
        Model.AbstractTitleInEnglishLabel, new { @class = "control-label mandatory" })
 </div>

从上面我第一次能够看到带有Abstract Title (in English) 之类的属性值的标签。提交给控制器后,我没有在控制器模型中获得该值。如果从控制器返回相同的视图。

我只能看到像 AbstractTitleInEnglishLabel 这样的属性名称,而不是它的值。这意味着属性的值在传递给控制器​​时不会存储在模型中。

 [HttpPost]
 public ActionResult Index(MeetingAbstract meetingAbstract)
    {
        if (!ModelState.IsValid)
        { // re-render the view when validation failed.
            return View(meetingAbstract);              
        }           
    }

如何在不使用@Html.HiddenFor 的情况下处理这个问题?因为我有很多要展示的标签。

【问题讨论】:

  • 将数据绑定到模型的唯一方法是使用可编辑字段(或 hiddenfor)。 displayfor 和 labelfor 不会将绑定到它们的值传递回控制器
  • @MattBody: 你能举个例子吗?
  • 拥有一个可以(重新)获取服务器端数据的 ViewModel 会更好。
  • 为了扩展@MattBodily 所说的内容,发送回控制器的唯一值是&lt;input&gt; 元素的形式,它们是HiddenForEditorFor 生成的。 LabelForDisplayFor 不生成表单 &lt;input&gt; 元素
  • 根据@jmoerdyk,您需要输入元素来处理您想要回发的任何内容。实现这一点的一个很好的简单方法(不必为您需要回发的每个属性写出 @Html.HiddenFor(model.PropertyName) )是装饰您想要发布但不想发布的所有属性在视图中可见,使用 HiddenInputAttribute 并将其与视图中的简单 EditorForModel html 帮助器结合使用,它将负责呈现所有必需的隐藏输入

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

我认为,根据我对您的需求的最佳理解,您可能需要在模型上添加数据注释。

using System;
using System.ComponentModel;
namespace MyProject.Models
{
    public class MyModel
    {
        [DisplayName("Abstract Title")]
        public string AbstractTitleInEnglish { get; set; }
    }
}

数据注释 ([DisplayName("Abstract Title"]) 将用作标签的显示文本。当您使用如下帮助方法时,标签文本将显示为“Abstract Title”,无论 post 或 get .

你必须像这样使用你的辅助方法:

@Html.LabelFor(model => model.AbstractTitleInEnglishLabel, new { @class = "control-label mandatory" })

【讨论】:

    【解决方案2】:

    HttpPost 操作会将您提供的任何属性放入 meetingAbstract。如果您想将额外的属性传递回视图,您必须从数据库中获取它们。这意味着您需要 ID 或其他东西来选择正确的行。如果你有身份证,那么你可以这样做

    meetingAbstract = db.MeetingAbstracts.Find(meetingAbstract.id);
    return View(meetingAbstract);
    

    【讨论】:

      【解决方案3】:

      Html.LabelFor 不会创建将数据发送回控制器所需的输入控件。这让我想知道为什么你需要那些在 post 方法中。您是否考虑过在 post 方法中使用 UpdateModel 方法,该方法将 post 中收到的属性应用于您传递给此方法的对象,同时保持其他属性不变。因此,您可以从数据库中获取对象并调用 UpdateModel 来更新取回的值。

      如果不是这样,那么您将必须生成隐藏项才能取回属性值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        • 2010-11-25
        • 2013-07-08
        • 2013-11-20
        • 1970-01-01
        相关资源
        最近更新 更多