如何从asp.net MVC剃刀视图中只POST完整模型的一部分
本文关键字:POST 模型 一部分 视图 asp net 剃刀 MVC | 更新日期: 2023-09-27 18:03:22
我有一个视图与@model声明为FullModel类型;
public class FullModel
{
public IList<Record> SomeRecords {get;set;}
public Record NewRecord {get;set;}
}
这个视图,呈现somerrecords,并且还呈现表单,用于将NewRecord发送到定义为:
的控制器方法:public ActionResult CreateNew(Record record)
{
...
}
像这样:
@using (@Html.BeginForm("CreateNew", "RecordController"))
{
@Html.TextBoxFor(x => x.NewRecord.SomeProp)
...
}
但这不起作用,因为路径从根FullModel
开始,所以POST数据变成NewRecord.SomeProp
,控制器期望Record
作为根,路径应该是SomeProp
通常处理这种情况的正确方法是什么?
您也可以使用TryUpdateModel
方法
public ActionResult CreateNew(FormCollection collection)
{
Record record = new Record();
TryUpdateModel<Record>(record, "NewRecord", collection);
// do more stuff
}
https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.tryupdatemodel%28v=vs.118%29.aspx M: System.Web.Mvc.Controller.TryUpdateModel % 60% 601% 28% 60% 600, System.String System.Web.Mvc.IValueProvider % 29
一种方法是使用TextBox
而不是TextBoxFor
,并定义您的自定义名称:
@using (@Html.BeginForm("CreateNew", "RecordController"))
{
@Html.TextBox("SomeProp", Model.NewRecord.SomeProp)
...
}
根据这篇博文,你应该使用一个编辑器模板。在您的情况下,使用。NET MVC来呈现NewRecord
的编辑器。这个编辑器将有正确的命名。
后续步骤:
- 在Views文件夹下创建名为
EditorTemplates
的文件夹。 -
为你的子视图模型(
NewRecord
)创建一个视图@model NewRecord @Html.TextBoxFor(x => x.SomeProp)
-
使用
EditorFor
让ASP。. NET MVC渲染编辑器,使用刚才构建的模板。@Html.EditorFor(x => x.NewRecord)
您可以在action参数上使用BindAttribute
来指定模型具有前缀