2013-11-22 30 views
0

我正在使用Viewmodel,但是当我提交表单时,我没有收回数值。MVC ViewModel不回发

我有一个模型就像这个...

Public Class ProductSummaryModel 

    Property productGUID As Integer 
    Property productName As String 
    Property productPrice As Double 
    Property productSku As String 
    Property categories As String() 
    Property ShipsWithin As Nullable(Of Integer) 
    <AllowHtml> 
    Property productWebDescription As String 
    Property ImageMainPath As String 

End Class 

然后,我有一个视图模型就像这个...

Public Class ProductViewModel 
    Public ProductSummary As ProductSummaryModel 
End Class 

这里是我的控制器......

Public Function Add() As ActionResult ' Default View To Add Item 
    Dim prdsummary As ProductViewModel = New ProductViewModel 
    Return View("Add", prdsummary) 
End Function 

在我的“添加”视图我有以下...

<tr> 
    <td>Price: </td> 
    <td><%=Html.TextBoxFor(Function(f) f.ProductSummary.productPrice)%></td> 
</tr> 

问题是,当我提交FORM时,我无法获得POSTED表单值。

Public Function AddItem(ByVal Model As ProductViewModel) As ActionResult ' Add Item into DB 

     Dim ajaxMessage As New AjaxFormResponse 

     Dim prd As ProductSummaryModel = New ProductSummaryModel 
     Model.ProductSummary = prd 

     Dim skuID As Integer = 0 
     msgbox(Model.ProductSummary.categories) ' Empty 

End Function 

可能有更好的方法来处理这个问题。

* UPDATE * *

我已经想通了,问题是什么......当传递模型视图模型我不得不这样做......

Dim Product As ProductViewModel = New ProductViewModel 
Dim ProductSummary As New ProductSummaryModel 
Product.ProductSummary = ProductSummary 
Return View("Add", Product) 

回答

1

为什么不使用ProductSummaryModel绑定而不是ProductViewModel。这样你可以保持简单。如果可以的话,避免嵌套绑定。 也请确保您在视图中使用了如下所示的HttpPost属性。在控制器

产品控制器

Public Class ProductController 
Inherits Controller 

' Main Action 
Public Function Main() As ActionResult 
    Dim prdViewModel As ProductViewModel = New ProductViewModel  
    prdViewModel.ProductSummary = New ProductSummaryModel 
    Return View("Main", prdViewModel) 
End Function 

' Partial Action 
Public Function Add() As ActionResult 
    Dim prdViewModel As ProductViewModel = New ProductViewModel 
    prdViewModel.ProductSummary = New ProductSummaryModel 

    Return View("Add", prdViewModel) 
End Function 

'POST Action from Partial View 
<HttpPost()> _ 
Public Function AddItem(ByVal Model As ProductSummaryModel) As ActionResult ' Add Item into DB 
    msgbox(Model.productPrice) ' Empty 
End Function 

End Class 

主视图

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage(Of MvcApplication2.ProductViewModel)" %> 

<asp:Content ID="manageTitle" ContentPlaceHolderID="TitleContent" runat="server"> 
    Main Page 
</asp:Content> 

<asp:Content ID="manageContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <% 
     Html.RenderPartial("_Add", Model.ProductSummary) 
    %> 
</asp:Content> 

管窥

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication2.ProductSummaryModel)" %> 

<asp:Content ID="registerTitle" ContentPlaceHolderID="TitleContent" runat="server"> 
    Register 
</asp:Content> 

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

    <% Using Html.BeginForm("AddItem", "Product")%> 
     <%: Html.AntiForgeryToken() %> 
     <tr> 
      <td>Price: </td> 
      <td><%: Html.TextBoxFor(Function(f) f.productPrice) %></td> 
     </tr> 
     <input type="submit" value="Register" /> 
    <% End Using%> 
</asp:Content> 

更新视图模型

Public Class ProductSummaryModel 

    Property productGUID As Integer 
    Property productName As String 
    Property productPrice As Double 
    Property productSku As String 
    Property categories As String() 
    Property ShipsWithin As Nullable(Of Integer) 
    <AllowHtml> 
    Property productWebDescription As String 
    Property ImageMainPath As String 

End Class 

Public Class ProductViewModel 
    Public ProductSummary As ProductSummaryModel 
End Class 

enter image description here

+0

Spock,这是我以前的做法,问题是......我有多个TABS,每个TAB都是一个局部视图。每个选项卡将包含自己的ViewModel,然后我将通过数据库发送我的主模型(ProductViewModel),而不是传递多个/独立的ViewModel。 – highwingers

+0

在具有局部视图的主视图中,使用Inherits =“System.Web.Mvc.ViewPage(Of MvcApplication2.ProductViewModel)”。您的部分视图使用我发布的上述解决方案。当您从主视图中将其作为部分视图调用时,例如Html.RenderPartial(“_ YourProduceSummaryPartialView,Model.ProductSummaryModel”)。当然在你的局部View @ Page Language =“VB”MasterPageFile =“〜/ Views/Shared/Site.Master” Inherits =“System.Web.Mvc.ViewPage(Of MvcApplication2.ProductSummaryModel)”%> – Spock

+0

这里是有关设置局部视图的更多信息http://forums.asp.net/p/1908088/5399482.aspx?Re+Html+RenderAction+causes+application+to+hang – Spock

0

我看到两个问题:

首先,当您这样做时,您将覆盖发布的值:

Dim prd As ProductSummaryModel = New ProductSummaryModel 
Model.ProductSummary = prd 

来自视图的模型中的ProductSummary属性会丢失,并且在读取其属性时只会获取默认值。

此外,您不显示如何在您的视图中设置categories值。你是否允许用户输入或此属性的其他操作?

+0

我创建productsummary的新实例,becaise我是越来越空实例厚望。是的,类别来自表单域...为了简化问题,我没有发布该部分。 ProductSummary是我的viewmodel中的一个对象,但是当我尝试访问我的viewmodel时,我得到异常。 – highwingers