MVC ViewModel没有发回

时间:2013-11-22 23:03:49

标签: asp.net-mvc asp.net-mvc-4

我正在使用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

然后我有一个像这样的ViewModel ......

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

在我的&#34;添加&#34;查看我有以下内容......

<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

可能有更好的方法来解决这个问题。

*更新 * *

我已经弄明白问题是什么......当将Model传递给ViewModel时,我必须这样做......

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

2 个答案:

答案 0 :(得分:1)

为什么不使用ProductSummaryModel进行绑定而不是ProductViewModel。这样你就可以保持简单。如果可以,请避免使用嵌套绑定。 另外请确保您在视图中使用如下,以及HttpPost attr。在控制器中

产品控制器

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

答案 1 :(得分:0)

我看到两个问题:

首先,当您执行此操作时,您将覆盖已过帐的值:

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

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

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