[英]Edit model object doesn't bind to view as expected
我正在使用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”为前缀。
有人知道/我在做什么错吗? 谢谢。
我不知道它是如何在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
嘿罗伯特-我不知道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进行的方式...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.