C# 编辑模型对象不';无法按预期绑定到视图

C# 编辑模型对象不';无法按预期绑定到视图,c#,asp.net-mvc,subsonic,spark-view-engine,C#,Asp.net Mvc,Subsonic,Spark View Engine,我正在使用ASP.NETMVC(1.0)、Spark View引擎(1.0)和亚音速引擎(3.0.0.3) 要使“编辑”视图正常工作,我遇到了一些问题。因此,在我的控制器中,我有以下显示编辑表单视图的控制器操作: [AcceptVerbs(HttpVerbs.Get)] public virtual ActionResult Edit(string name) { var plot = Plot.SingleOrDefault(p => p.UserID == LoggedInUs

我正在使用ASP.NETMVC(1.0)、Spark View引擎(1.0)和亚音速引擎(3.0.0.3)

要使“编辑”视图正常工作,我遇到了一些问题。因此,在我的控制器中,我有以下显示编辑表单视图的控制器操作:

[AcceptVerbs(HttpVerbs.Get)]
public virtual ActionResult Edit(string name)
{
    var plot = Plot.SingleOrDefault(p => p.UserID == LoggedInUser.ID && p.UrlFriendlyName == name);
    // ViewData["plot"] = plot;
    return View(plot);
}
该视图上的表单发回以下控制器操作:

[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(Plot plot)
{
    var validator = new PlotValidator();
    try
    {
        var results = validator.Validate(plot);
        if (!results.IsValid)
        {
            ...
        }
    }
}
我遇到的问题是,第一个控制器操作实际上没有使用提交给它的Plot对象的值填充表单。填充表单的唯一方法是将绘图添加到ViewData:

ViewData["plot"] = plot;
这会填充编辑表单,但当我编辑值并将其提交回上面列出的第二个控制器操作时,它只会发送回,基本上是一个带有新值的新绘图,而不是带有更新值的绘图发送到编辑表单

我肯定我可能只是错过了一些简单的东西,但我似乎不知道它是什么。我表单上的所有字段都有前缀为“plot”的ID


有人知道/看到我做错了什么吗?谢谢。

我不知道Spark view引擎是如何实现的,但在ASP.NET MVC附带的开箱即用视图引擎中,这是通过使用page指令在页面中继承强类型视图模型对象来实现的,而不是使用普通ViewPage附带的字典

因此,视图中的第一行代码不是这样的:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage" %>
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
     Inherits="System.Web.Mvc.ViewPage<HomePageViewModel>" %>

它看起来更像这样:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage" %>
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
     Inherits="System.Web.Mvc.ViewPage<HomePageViewModel>" %>

您当前的控制器代码需要一个强类型对象,但取而代之的是一个ViewData字典。因此,没有发生绑定

考虑查看以下播客:

探索如何在Spark中使用ViewData(强类型和弱类型)
嘿,罗伯特-我不知道Spark是如何处理数据的,但我可以告诉你,第二部分很容易修复

首先,你必须记住MVC不会为你进入数据库。在您的情况下,提取记录的标准似乎涉及两个标准——因此,如果您想确保数据设置正确,就必须再次提取该标准。因此,在发布后将您的签名更改为:

[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(string id, FormCollection form)
{
//assuming you have some kind of PK
var plot = Plot.SingleOrDefault(p => p.ID == id);    
UpdateModel(plot, form.ToValueProvider());
var validator = new PlotValidator();
    try
    {
        var results = validator.Validate(plot);
        if (!results.IsValid)
        {
            ...
        }
    }
}

这是徒手操作-但无论如何,这是你必须使用L2S的方式…

是的,我在一个Spark演示解决方案(我想是Northwind演示)中看到了这一点,我尝试过,出于某种原因,UpdateModel似乎什么都没做。它根本没有改变绘图的状态,尽管我可以看到表单对象中包含了预期的数据。我似乎无法让这些东西按预期工作,这就是为什么我认为这只是我缺少的东西。