0

我正在使用 ASP.NET MVC (1.0)、Spark View Engine (1.0) 和 SubSonic (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 对象的值填充表单。我可以让它填充表单的唯一方法是将 Plot 添加到 ViewData:

ViewData["plot"] = plot;

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

我确定我可能只是错过了一些简单的东西,但我似乎无法弄清楚它是什么。我表单上的所有字段都有以“plot”为前缀的 ID。

任何人都知道/看到我做错了什么?谢谢。

4

2 回答 2

1

我不知道它在 Spark 视图引擎中是如何完成的,但是在 ASP.NET MVC 附带的开箱即用的视图引擎中,这是通过在页面中继承强类型视图模型对象来完成的一个页面指令,而不是使用普通 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>" %>

您当前的控制器代码需要一个强类型对象,但它正在返回一个 ViewData 字典。所以没有发生绑定。

考虑查看以下播客:

探索如何在 Spark 中使用 ViewData(强类型和弱类型) http://www.dimecasts.net/Casts/CastDetails/117

于 2009-09-17T02:10:56.457 回答
1

嘿罗伯特 - 我不知道 Spark 如何处理它的数据,但我可以告诉你,第二部分很容易修复。

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

[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 来做这件事......

于 2009-09-17T03:43:42.360 回答