从viewModel中的另一个对象填充隐藏的表单字段

时间:2016-12-30 21:16:31

标签: asp.net-mvc forms razor

我有一个视图模型(vm)的视图 vm具有ICollection< Conversation>对话 每个对话都有ICollection< Message>消息。消息具有公共虚拟< Collection>。 还有一个< Message> vm中的NewMessage空对象因此vm中有两个顶级对象类。

vm.NewMessage和vm.Conversations

对话中的For-Each对话我正在显示一个输入表单,用于捕获NewMessage,然后通过Messages捕获For-Each,以在输入表单下方显示对话的当前状态。 (即我在页面上有多个表格)

每个表单都有一个隐藏字段,表示它属于哪个对话

foreach(cnv in Model.Conversations)
{
  @Html.BeginForm()
  {
      <fieldset>
          <legend>new message:</legend>
          @Html.LabelFor(nm => nm.NewMessage.MessageText)
          @Html.EditorFor(nm => nm.NewMessage.MessageText)
          @Html.HiddenFor(nm => nm.NewMessage.Conversation.ID )
          ... other form stuff like submit/clear form
      </fieldset>
  }
  ... do the stuff to display the current conversation
}  

如何使用当前对话的ID填充隐藏值,或者我是否以错误的方式接近此值?

1 个答案:

答案 0 :(得分:1)

您当前的代码将为循环中的每个项目生成这样的HTML标记

<input class="text-box single-line" id="NewComment_MessageText"
                                  name="NewComment.MessageText" type="text" value="">

因此,如果您的http post action方法的参数为Message,则在提交表单时,它将为null,因为模型绑定器无法将此表单字段值绑定到Message对象。 (它将与您当前的视图模型一起使用,其中Message是属性

您应该为模型绑定器生成以下标记才能工作

<input class="text-box single-line" name="MessageText" type="text" value="">

你可以通过

来做到这一点
foreach(cnv in Model.Conversations)
{
  @using(Html.BeginForm("SaveComment","YourControllerName"))
  {
      <fieldset>
          <legend>new message:</legend>
           @Html.Label("MessageText")
           @Html.TextArea("MessageText")
           @Html.Hidden("ConversationId",cnv.ID)
           <input type="submit" />
       </fieldset>
  }
  ... do the stuff to display the current conversation
}  

@Html.Hidden("ConversationId",cnv.Id)行将生成名为ConversationId的隐藏输入字段和表达式cnv.ID

中的值

假设您的HttpPost操作方法参数是Message对象,另一个参数名为ConversationId(与我们的输入字段名称相同),它应该可以正常工作

[HttpPost]
public ActionResult SaveComment(Message msg,int conversationId)
{
    // to do: return something
}