2009-09-17 61 views
0

我使用ASP.NET MVC(1.0),星火视图引擎(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。

任何人都知道/明白我做错了吗?谢谢。

回答

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>" %> 

您当前的控制器代码期待一个strongly-类型的对象,但是它取回了一个ViewData Dictionary。所以没有发生绑定。

考虑审议以下播客:星火

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

1

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

首先 - 你要记住MVC不会伸入DB你。在你的情况下,你提出的记录标准似乎涉及两个标准 - 所以如果你想确保数据设置正确,你必须再次提取。所以在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来完成的...

+0

是的,我看到在Spark演示解决方案之一(我认为是Northwind Demo),我试过了,出于某种原因,UpdateModel似乎没有做任何事情。它根本不会改变剧情的状态,尽管我可以看到表单对象中有预期的数据。我似乎无法像预期的那样得到这些东西,这就是为什么我认为这只是我缺少的东西。 – 2009-09-17 03:55:11