POST操作方法中强类型的ViewModel仅包含空值

时间:2009-04-14 16:14:57

标签: asp.net-mvc

我正在尝试使用强类型视图实现我的Edit操作方法,该视图接收自定义形状的ViewModel类。换句话说,我想要一个强类型的ViewModel,它包含应该编辑的Linq实体以及应该在View中显示的一些其他对象。

我可以在调用GET Edit操作方法时看到该视图,但强类型的POST操作方法只接收带有null参数的ViewModel类,我无法弄清楚如何检索POST参数。

视图模型如下所示:

//my custom-shaped ViewModel
public class CustomersFormViewModel
{
    public SelectList AccountTypesDropDownBox;
    public SelectList CountriesDropDownBox;
    public Customer Customer;
}

动作方法如下:

//
// GET: /CustomersController/Edit   

public ActionResult Edit(int ID)
{
   var model = new CustomersFormViewModel
                    {
                        Customer = repository.Load(ID.Value),
                        CountriesDropDownBox = GetCountries(),
                        AccountTypesDropDownBox = GetAccountTypes()
                    };
    return View(model);
}

//
// POST: /CustomersController/Edit  

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(CustomersFormViewModel model)
{
    //THE NEXT LINE THROWS!!!
    Debug.Assert(Model.Customer!=null);
    return View(model);
}

这是我的编辑视图:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/CustAdminMaster.master"
    Inherits="System.Web.Mvc.ViewPage<Zeiterfassung.Controllers.CustomersController+CustomersFormViewModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    NewEdit
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        NewEdit</h2>
    <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
    <% using (Html.BeginForm())
       {%>
    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="FirstName">FirstName:</label>
            <%= Html.TextBox("FirstName",Model.Customer.FirstName) %>
            <%= Html.ValidationMessage("FirstName", "*") %>
        </p>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
    <% } %>
    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>
</asp:Content>

我也尝试过使用formValues参数的POST操作方法,但是viewmodel仍然没有包含已发布的参数:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int ID, FormCollection formValues)
{
      CustomersFormViewModel model = new CustomersFormViewModel();            
      UpdateModel(model);
      //THE NEXT LINE STILL THROWS
      Debug.Assert(model.Customer!=null);
      return View("NewEdit",model);
}

到目前为止,我找到的唯一方法是编写自己的代码,从FormCollection中获取已发布的参数,并相应地更新我的自定义ViewModel。但这种方法似乎有点原始。真的没有更好的办法吗?

编辑:我刚在tvanfosson建议的视图中尝试了不同的语法,但问题仍然没有改变:

<label for="Customer.FirstName">FirstName:</label>
    <%= Html.TextBox("Customer.FirstName") %>
    <%= Html.ValidationMessage("Customer.FirstName", "*") %>

3 个答案:

答案 0 :(得分:7)

您需要根据模型中的前缀命名字段。此外,您还需要修改视图模型以使用属性而不是字段。默认模型绑定器仅在绑定时查看模型上的公共属性。

    <label for="Customer.FirstName">FirstName:</label>
    <%= Html.TextBox("Customer.FirstName") %>
    <%= Html.ValidationMessage("Customer.FirstName", "*") %>

这样,模型绑定器知道如何将表单参数与模型的相应组件和关联属性相关联。

答案 1 :(得分:6)

已经有一段时间了,但是这个确实没有答案。

在我使用私有设置的viewmodel上捕获了auto属性之前,我一直在篡改同样的问题。

期待您的viewmodel,您将错过自动属性get和setter!

因此,相应地更改您的viewmodel:

public class CustomersFormViewModel

    {
        public SelectList AccountTypesDropDownBox {get; set;}
        public SelectList CountriesDropDownBox {get; set;}
        public Customer Customer {get; set;}
    }

答案 2 :(得分:0)

尝试

UpdateModel(model, "Customer");

还可以看一下:

UpdateModel prefix - ASP.NET MVC

如果仍然无效,请在UpdateModel之后设置断点。如果它没有完成这项工作,请尝试使用不同的调用UpdateModel组合的quickWatch(ctrl + alt + q)。

如果仍然不起作用,请连接源并调试一下:)。你会学到新东西,然后你就会告诉我们:)。然后大家都很开心。

祝你好运。