如何从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

通常处理这种情况的正确方法是什么?

如何从asp.net MVC剃刀视图中只POST完整模型的一部分

您也可以使用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来指定模型具有前缀