2009-04-14 72 views
7

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

我可以在调用GET Edit操作方法时看到视图,但强类型的POST操作方法仅接收一个带有空参数的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操作方法,但视图模型仍不包含发布的参数:

[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张贴的参数,并更新我的自定义视图模型相应。但是这种方法似乎有点原始。有没有更好的方法来做到这一点?

编辑:我只是试着视图中的不同的语法tvanfosson建议,但问题仍然不变:

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

回答

7

您需要命名字段按照模型中的前缀。另外,您需要修改视图模型以使用属性而不是字段。默认模型联编程序仅在绑定时查看模型上的公共属性。

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

通过这种方式,模型联编程序知道如何将表单参数与模型的相应组件和关联属性相关联。

+0

感谢您的答复! “Customer.FirstName”不起作用,因为客户是我的模型的一部分,但不是模型。我假设你的意思是Model.Customer.FirstName,我试过了(请参阅我的帖子编辑),但问题没有改变。 – 2009-04-14 16:52:03

+0

客户是您的模型的财产,因此使用“Customer.FirstName”是适当的。它将使用反射来查找模型上的“客户”属性,然后在其上查找“FirstName”属性。如果找到匹配属性,您也不需要提供将从模型中检索的值 – tvanfosson 2009-04-14 16:55:27

+0

我刚刚将帖子中的确切行粘贴到我的视图中。问题没有改变。另外,我尝试在GET操作方法中设置FirstName以“测试”。在浏览器中查看视图时,输入字段为空,因此,您建议的语法必须有错误 – 2009-04-14 17:14:14

0

尝试

UpdateModel(model, "Customer"); 

而且还到这里看看:

UpdateModel prefix - ASP.NET MVC

如果还是不行,在之后的UpdateModel设置一个断点。如果它没有完成这项工作,请使用调用UpdateModel的不同组合来尝试quickWatch(ctrl + alt + q)。

如果它仍然没有工作,挂钩源和调试了一下:)。你会学到一些新的东西,然后你会告诉我们这个:)。然后大家都开心。

祝你好运。

6

它已经有一段时间了,但实际上并没有在这一个答案。

被篡改相同的问题,直到我捕捉我的viewmodel具有私人集自动财产。

寻找你的viewmodel你缺少汽车性能get和setters所有在一起!

所以相应地更改您的视图模型:

public class CustomersFormViewModel 

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

然而,你是对的,但是,tvanfosson大约8个月前;-) – 2010-01-14 18:29:12

+2

也陷入了这一点,虽然我没有看到tvanfosson建议检查私人二传手。无论如何,从私人设置切换到设置工作。感谢Ithai。 – trevorc 2011-02-09 19:08:31

相关问题