如何从ASP .NET MVC razor视图中仅发布部分完整模型

时间:2015-07-19 14:28:58

标签: c# asp.net-mvc razor

我有一个视图,其中@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 }}

通常的\处理这个问题的正确方法是什么?

4 个答案:

答案 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呈现编辑器。该编辑器将具有正确的命名。

要遵循的步骤:

  • Views 文件夹下,创建名为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
}

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