繁体   English   中英

编辑模型对象未按预期绑定到视图

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM