【问题标题】:passing data from view to controller on asp.net mvc 3在asp.net mvc 3上将数据从视图传递到控制器
【发布时间】:2012-05-23 19:57:48
【问题描述】:

我在将数据从视图传递到控制器时遇到问题,我有一个使用我的视图模型“TimeLineModel”强类型的视图,在第一个视图中,我通过控制器上的操作将我的视图模型传递给了这个视图

public ActionResult confirmation(long socialbuzzCompaignId)
    {

      return View(new TimeLineModel() { socialBuzzCompaignId = socialbuzzCompaignId, BuzzMessages = model });

    }

有了这个,我可以从我的操作中获取信息并将其显示在视图中,但我还有其他操作 POST,我不会让我的视图模型做一些 traitement

    [HttpPost]
    public ActionResult confirmation(TimeLineModel model)
    {


    } 

我可以获得模型的一些属性,但在其他情况下没有,例如我可以获得模型的属性“socialBuzzCompaignId”,但其他属性如“IEnumerable BuzzMessages”我无法获得它,我现在不知道为什么! 这是我观点的内容

    @model Maya.Web.Models.TimeLineModel   
  @{
       ViewBag.Title = "confirmation";
    }
  @using (Html.BeginForm())
   {
     <h2>confirmation</h2>
       <fieldset>                       
          @foreach (var msg in Model.BuzzMessages)
          {                      
            <div class="editor-label">
              @msg.LongMessage
           </div>
           <br />
      }


    <p>
        <input type="submit" value="Save" />
    </p>

  </fieldset>

}

【问题讨论】:

  • 您可能没有在表单中正确包含 BuzzMessages,因此它没有正确绑定到您的 TimeLineModel。请显示与您未收到的属性相对应的视图部分。
  • 好的,AFinkelstein 先生,我将编辑问题并添加我的视图内容

标签: asp.net-mvc-3 c#-4.0 view controller


【解决方案1】:

您需要在表单元素中包含 BuzzMessages 属性。由于它不可编辑,您可能想要使用隐藏。有两种方法可以做到这一点。最简单的方法不是执行foreach 循环,而是执行for 循环并按索引插入它们。

@for (int i =0; i<Model.BuzzMessages.Count(); i++v)
{                      
    <div class="editor-label">
          @Model.BuzzMessages[i].LongMessage
          @Html.HiddenFor(m => m.BuzzMessages[i].LongMessage);
    </div>
       <br />
}

但要做到这一点,您需要在视图模型中使用 IList 而不是 IEnumerable 来按索引访问。

或者,您可以创建一个以您的 BuzzMessages 类命名的编辑器模板(无论它的名称是什么)。

@model BuzzMessagesClass

@Html.HiddenFor(m => m.LongMessages)
<!-- Include other properties here if any -->

然后在您的主页中

@Html.EditorFor(m => m.BuzzMessages)

如果编辑器模板的细节让您感到困惑,请查看http://coding-in.net/asp-net-mvc-3-how-to-use-editortemplates/ 或搜索堆栈溢出。

【讨论】:

  • 伟大的 AFinkelstein 先生,很高兴我认为您的第二个建议没有必要使用,因为我只想显示味精而不是编辑它,谢谢您的帮助!!!
【解决方案2】:

就像任何 HTML POST 方法一样,您必须以某种方式将数据返回给控制器。只是简单地“显示”页面上的数据不会重新绑定它。

您必须将数据放入输入(或将回传的控件)中,以适当的模型属性名称。

因此,如果您有一个名为 FirstName 的模型属性,并且您希望在 POST 上将此数据重新绑定到模型,则必须通过放置“隐藏输入”(或回发的类似控件)将其提供回模型) ID 为 FirstName 将在 POST 上将该属性重新绑定到模型。

希望能解释一下。

【讨论】:

    【解决方案3】:
    @foreach (var msg in Model.BuzzMessages)
    {                      
        <div class="editor-label">
            @msg.LongMessage
            <input type="hidden" name="BuzzMessages.LongMessage" value="@msg.LongMessage" />
        </div>
    }
    

    它将发布 LongMessages 数组。获取这样的值:

    [HttpPost]
    public ActionResult confirmation(TimeLineModel model, FormCollection collection)
    {
        var longMessages = collection["BuzzMessages.LongMessage"];
    }
    

    【讨论】:

    • 在 MVC3 中使用 FormCollection 和在不使用 Html Helpers 的情况下创建输入我认为都是坏主意。
    • 感谢 Karaxuna 先生,它可以工作,并且不需要在其中添加其他参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多