我是MVC的新手,因此正在这里的NerdDinner教程中进行工作。 特别是,我在使用UpdateModel方法时遇到了问题,该教程的第五部分对此进行了说明。 问题是,当我尝试使用UpdateModel方法编辑晚餐对象的值时,这些值不会得到更新,并且不会引发任何异常。

奇怪的是,本教程中说明的“创建”或“删除”功能没有任何问题。 仅更新功能不起作用。

下面,我包括了我正在使用的Controller代码以及视图标记,该标记包含在aspx视图文件和ascx部分视图文件中。

这是我的控制器内的代码,名为DinnerController.cs:

    //
    // GET: /Dinners/Edit/2
    [Authorize]
    public ActionResult Edit(int id)
    {

        Dinner dinner = dinnerRepository.GetDinner(id);

        return View(new DinnerFormViewModel(dinner)); 
    }

    //
    // POST: /Dinners/Edit/2
    [AcceptVerbs(HttpVerbs.Post), Authorize]
    public ActionResult Edit(int id, FormCollection formValues)
    {

        Dinner dinner = dinnerRepository.GetDinner(id);

        try
        {
            UpdateModel(dinner);
            var x = ViewData.GetModelStateErrors(); // <-- to catch other ModelState errors

            dinnerRepository.Save();

            return RedirectToAction("Details", new { id = dinner.DinnerID });
        }
        catch
        {

            ModelState.AddRuleViolations(dinner.GetRuleViolations());

            return View(new DinnerFormViewModel(dinner)); 
        }
    }

从另一个StackOverflow线程中读取可能的解决方案后,添加了带有注释“捕获其他ModelState错误”的行,这里:

ASP.NET MVC Updatemodel不更新但不引发错误

不幸的是,该解决方案并没有帮助我。

这是我的Dinners / Edit.aspx视图中的相应标记:

<asp:Content ID="Main" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Edit Dinner</h2>

    <% Html.RenderPartial("DinnerForm"); %>

</asp:Content>

这是我的DinnerForm.ascx部分视图中的相应标记。 此部分视图文件也被创建功能使用,可以正常工作

<%=Html.ValidationSummary("Please correct the errors and try again.") %>  

<% using (Html.BeginForm()) { %>

    <fieldset>
        <p>
            <label for="Title">Dinner Title:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.Title)%>
            <%=Html.ValidationMessage("Title", "*") %>
        </p>
        <p>
            <label for="EventDate">EventDate:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.EventDate, new { value = String.Format("{0:g}", Model.Dinner.EventDate) })%>
            <%=Html.ValidationMessage("EventDate", "*") %>
        </p>
        <p>
            <label for="Description">Description:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.Description)%>
            <%=Html.ValidationMessage("Description", "*")%>
        </p>
        <p>
            <label for="Address">Address:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.Address)%>
            <%=Html.ValidationMessage("Address", "*") %>
        </p>
        <p>
            <label for="Country">Country:</label>
            <%=Html.DropDownListFor(model => Model.Dinner.Country, Model.Countries)%>
            <%=Html.ValidationMessage("Country", "*") %>
        </p>
        <p>
            <label for="ContactPhone">ContactPhone #:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.ContactPhone)%>
            <%=Html.ValidationMessage("ContactPhone", "*") %>
        </p>
        <p>
            <label for="Latitude">Latitude:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.Latitude)%>
            <%=Html.ValidationMessage("Latitude", "*") %>
        </p>
        <p>
            <label for="Longitude">Longitude:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.Longitude)%>
            <%=Html.ValidationMessage("Longitude", "*") %>
        </p>
        <p>
            <input type="submit" value="Save"/>
        </p>
    </fieldset>

<% } %>

无论如何,我已经为此花了几个小时了,而且我没有主意。 因此,我希望这里有人可以帮助我朝着正确的方向前进,以便弄清我做错了什么。

#1楼 票数:2

dinnerRepository.Save()是实际更新数据库的代码。 UpdateModel(dinner)作用是从表单集合中提取值并将其放入dinner对象中。

#2楼 票数:1 已采纳

你把事情弄混了。 您正在将DinnerFormViewModel发送给View,但试图接收Dinner。请按以下方式更改post方法:

[AcceptVerbs(HttpVerbs.Post), Authorize]
    public ActionResult Edit(int id, FormCollection formValues)
    {

        var dinner=new DinnerFormViewModel(dinnerRepository.GetDinner(id));

        try
        {
            UpdateModel(dinner);
            var x = ViewData.GetModelStateErrors(); // <-- to catch other ModelState errors

            dinnerRepository.Save();

            return RedirectToAction("Details", new { id = dinner.Dinner.DinnerID });
        }
        catch
        {

            ModelState.AddRuleViolations(dinner.GetRuleViolations());

            return View(new DinnerFormViewModel(dinner)); 
        }
    }

我可能在这里错过了一些事情,现在不记得晚餐了。 请检查那些

编辑:实际上我意识到这篇文章并不能真正解决问题。 问题中发布的代码对我有用。 有问题,但不是这里。

#3楼 票数:1

以防万一将来对其他人有帮助,这里的问题不一定是由于我怀疑使用了DinnerFormViewModel。 相反,问题出在使用强类型的辅助方法(例如Html.TextBoxFor)以及我调用UpdateModel方法的方式。

这个问题,它的解决方案进行了详细的StackOverflow的另一个线程解释说, 这里

  ask by campbelt translate from so

未解决问题?本站智能推荐:

2回复

Nerddiner演练是否适合ASP.NETMVC2?

我很想自学ASP.NET MVC 2(来自沉重的嵌入式或丰富的GUI背景)。 如果找到了nerddiner演练,但仍适用于ASP.NET MVC1 。将codeplex下载更新为MVC 2,但PDF的链接可追溯到MVC 1。 甚至可以按照MVC 2中的演练进行操作吗? 如果是这样,
2回复

Asp.netMVC验证非字符串

我最初使用NerdDinner教程作为基本概述在MVC 1.0中构建了我的网站。 许多早期的设计决策都是简单地由b / c做出的,“ NerdDinner就是这样做的。”从那时起,它确实发展了起来,并转换为2.0。 我的验证仍然按照NerdDinner的方式进行,并且非常少,因此,尽管我已
2回复

当表单字段留空时,MVC2中的NerdDinner表单验证DataAnnotations错误

平台: Windows 7 Ultimate IDE: Visual Studio 2010旗舰版 Web环境: ASP.NET MVC 2 数据库: SQL Server 2008 R2 Express 数据访问: 实体框架4 表单验证: DataAnnotations
1回复

更新ASP.NETMVC2中的复杂模型?

如何更新复杂的模型? 我有以下观点: 而且我像往常一样只是在模型对象上调用UpdataModel来更新它:UpdateModel(week); 但这没有用。 因此,我读了一些关于必须在复杂模型中分别更新每个属性的内容,并尝试使其适应我的情况。 这是我在Controller中的尝试:
1回复

mvc2.0updatemodel和我的ID列

我已经在MVC 2.0应用程序中创建了一个create视图,默认情况下,它包含一个用于整数ID列的字段。 这绝对是我不需要的领域。 如果我尝试在代码中创建对象时删除该字段并使用updatemodel,是否会中断,因为即使它是自动递增的,它也看不到我的ID列数据正在传递? 另外,我注意
1回复

MVC:使用UpdateModel更新大孩子

我有一个嵌套的视图模型,并且正在使用它来更新(编辑)表单。 我可以使用UpdateModel更新父级和子级,但不能更新大子级。 我为UpdateModel前缀名称尝试了“ Answers”和“ Questions.Answers”,但它没有更新。 任何帮助表示赞赏! 查看模型
3回复

无法打开登录请求的数据库“数据库”

我正在研究一个.Net MVC示例应用程序。 我已将aspnet成员资格api表添加到现有数据库中。 我已经修改了web.config文件,如下所示: 在我的实际应用程序中,如果我想注册为用户,单击提交时会出现以下异常: 我正在使用Visual Studio 2010和SQL Ser
8回复

ASP.NETMVC:有多少个存储库?

我正在使用ASP.NET MVC设计一个网站,对于存储库的确切性质可能有点困惑。 在NerdDinner示例之后,我的站点应该有一个存储库,根据需要提供实体。 但是,我也听说你应该有不同的存储库来处理特定的相关实体集.... 在我的网站的情况下,将有许多实体(大约15个表)但大多数都是