我有一个视图,其中@model声明为FullModel类型;
public class FullModel
{
public IList<Record> SomeRecords {get;set;}
public Record NewRecord {get;set;}
}
此视图呈现SomeRecords,并且还将用于发布NewRecord的Form呈现为定义为的控制器方法:
public ActionResult CreateNew(Record record)
{
...
}
这样的事情:
@using (@Html.BeginForm("CreateNew", "RecordController"))
{
@Html.TextBoxFor(x => x.NewRecord.SomeProp)
...
}
但这不起作用,因为路径从根FullModel
开始,因此POST数据变为NewRecord.SomeProp
而控制器期望Record
为root,路径应为{{1 }}
通常的\处理这个问题的正确方法是什么?
答案 0 :(得分:0)
一种方法可能是使用TextBox
代替TextBoxFor
并定义您的自定义名称:
@using (@Html.BeginForm("CreateNew", "RecordController"))
{
@Html.TextBox("SomeProp", Model.NewRecord.SomeProp)
...
}
答案 1 :(得分:0)
根据this blog post,您应该使用Editor Template,ASP.NET MVC使用它来为您的案例中的NewRecord
呈现编辑器。该编辑器将具有正确的命名。
要遵循的步骤:
EditorTemplates
。为子视图模型创建一个视图(NewRecord
)。
@model NewRecord
@Html.TextBoxFor(x => x.SomeProp)
使用EditorFor
让ASP.NET MVC使用您刚刚构建的模板渲染编辑器。
@Html.EditorFor(x => x.NewRecord)
答案 2 :(得分:0)
您可以在action参数上使用BindAttribute
来指定模型具有前缀。
答案 3 :(得分:0)
您还可以使用TryUpdateModel
方法。
public ActionResult CreateNew(FormCollection collection)
{
Record record = new Record();
TryUpdateModel<Record>(record, "NewRecord", collection);
// do more stuff
}