我有一个视图模型(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填充隐藏值,或者我是否以错误的方式接近此值?
答案 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
}