我正在使用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;
这会填充编辑表单,但是当我编辑这些值并将其提交回上面列出的第二个控制器操作时,它只会发送回来,基本上是一个带有新值的新图,而不是发送到编辑表单的图。更新值。
我确信我可能只是错过了一些简单的东西,但我似乎无法弄清楚它是什么。我表单上的所有字段都有ID,前缀为“plot。”
任何人都知道/看到我做错了什么?感谢。
答案 0 :(得分: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
答案 1 :(得分: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做这件事......