【问题标题】:How to Post Form from View strongly Typed to ViewModel?如何将表单从强类型视图发布到 ViewModel?
【发布时间】:2011-03-31 23:26:36
【问题描述】:

我有一个这样的视图模型:

public class MyViewModel
{
    public MyObject myObject{ get; set; }
    public List<MyList> myList{ get; set; }
}

我有一个强类型为MyViewModel 的表单视图

此视图允许您输入 MyObject 的属性值,以及创建 MyList 对象的列表。 List 部分工作正常,虽然我认为这会是两者中更难的部分。

假设 MyObject 有一个属性 Description 我创建一个文本框来输入值:

@Html.EditorFor(x => x.myObject.Description);

文本框以MyObject_Description 的 id 呈现...问题是当我将它发布到我的控制器操作时,MyObject 根本没有被绑定(尽管列表项在收到适当的 ID 时会执行“ MyViewModel_MyList[guid].myListValue")

我在这里做错了什么??

编辑:更多信息

视图的第一行是: @model MyApp.ViewModels.MyViewModel

还有Action方法:

    [HttpPost]
    public ActionResult Create(MyViewModel myViewModel)
    {

    }

我正在将一个新的 MyViewModel 传递给局部视图以开始...

public ActionResult Create()
    {
        MyViewModel model = new MyViewModel();
        return PartialView(model);
    } 

编辑 2

好的,当我渲染包含我调用的表单的局部视图时:

@{Html.RenderAction("Create", "MyController");}

这是从 @model IEnumerable&lt;MyApp.Models.MyObject&gt; 类型的视图中调用的 (此视图显示当前存在的 MyOjects 列表,并在底部呈现部分以允许用户将另一个 MyObject 添加到 DB)

【问题讨论】:

  • 你能显示你的视图的第一行吗?你的 Action 方法的第一行/定义行?
  • 你的控制器方法是什么样的?您是否还在一个页面中呈现所有元素?
  • 也只是为了确保 MyObject 有一个默认的构造函数?
  • 是的 MyObject 实际上是一个 EF 对象
  • Placed Get Create 上面有问题的方法...只是传递了一个新的 MyViewModel 实例...

标签: c# asp.net asp.net-mvc asp.net-mvc-3


【解决方案1】:

如果您还没有这样做,请尝试创建一个名为 MyObject.cshtml 的编辑器模板(例如,Views->Shared->EditorTemplates)。将您的部分视图内容移动到此视图,然后调用

@Html.Editor("myObject"). 

从您的父级部分视图。

【讨论】:

  • 因为这实际上是一个相当复杂的视图,你有理由相信这会解决问题吗?,在我花很多时间在这之前你知道吗
  • 好的,我继续并快速尝试了这个...如果我删除与发布 MyList 对象有关的所有内容,MyObject 工作正常...只要我将列表添加回混合,列表有效,但 MyObject 值停止传递....这是一个非常令人沮丧的问题!
  • 仍未解决,但我会为您在帮助我解决此问题方面所做的努力给予支持
  • 我需要更多信息来回答这就是为什么我说它可能会起作用。您如何为 MyObject 调用现有的部分?
  • 好的,在上面的 EDIT 2 下添加了更多信息
【解决方案2】:

将您的 ViewModel 更改为直接具有描述

public class MyViewModel
{
    public string Description { get; set; }
    public List<MyList> myList{ get; set; }
}

然后相应地绑定

@Html.EditorFor(x => x.Description);

【讨论】:

  • 嗯,我需要用MyObject绑定到其他属性,描述只是我的例子
【解决方案3】:

我希望您的视图的第一行看起来像这样:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<MyViewModel>" %>

这告诉视图它提供的模型是MyViewModel 类型(类似于&lt;T&gt; 样式)。

【讨论】:

  • 对不起,忘了说,这个视图是局部视图
  • 哦,请确保您正确地将模型对象传递给局部视图。那行代码看起来怎么样?
  • 这只有在他使用 Aspx/Ascx 页面时才是正确的,而他显然不是。他正在使用 Razor。
【解决方案4】:

我认为开箱即用的模型绑定不知道如何绑定到复杂对象。您可能需要编写某种自定义模型绑定器。

恐怕这不是我自 MVC1 以来所做的事情,所以我有点犹豫是否给你任何示例代码,因为从那时起机制很可能已经完全改变了。一个快速的谷歌确实出现了这篇文章http://www.learnxpress.com/asp-net-mvc-hosting-6-tips-for-asp-net-mvc-model-binding-2.html和这篇文章http://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.html

编辑:我刚刚看到这个答案可能对Retrieving data from view, should I use model binder?有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-09
    • 2016-01-04
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2019-10-31
    相关资源
    最近更新 更多