Asp.net mvc MVC ViewModel未回发

Asp.net mvc MVC ViewModel未回发,asp.net-mvc,asp.net-mvc-4,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 Str

我使用的是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>
也许有更好的方法来处理这件事

*更新**

我已经找出了问题所在…当将模型传递给ViewModel时,我必须这样做

Dim Product As ProductViewModel = New ProductViewModel
Dim ProductSummary As New ProductSummaryModel
Product.ProductSummary = ProductSummary
Return View("Add", Product)
我看到两个问题:

首先,执行此操作时将覆盖已发布的值:

Dim prd As ProductSummaryModel = New ProductSummaryModel
Model.ProductSummary = prd
来自您视图的模型中的
ProductSummary
属性丢失,您仅在读取其属性时获得默认值


此外,您不会显示如何在视图中设置
类别
值。是否允许用户输入或对该属性执行其他操作

为什么不使用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
公共类ProductController
继承控制器
"主要行动",
作为ActionResult的公共函数Main()
Dim prdViewModel As ProductViewModel=新ProductViewModel
prdViewModel.ProductSummary=新产品SummaryModel
返回视图(“主”,prdViewModel)
端函数
"部分行动",
作为ActionResult的公共函数Add()
Dim prdViewModel As ProductViewModel=新ProductViewModel
prdViewModel.ProductSummary=新产品SummaryModel
返回视图(“添加”,prdViewModel)
端函数
'从局部视图发布操作
_
公共函数AddItem(ByVal模型作为ProductSummaryModel)作为ActionResult“将项添加到数据库中”
msgbox(Model.productPrice)为空
端函数
末级
主视图

<%@ 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>

主页
局部视图

<%@ 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
公共类ProductSummaryModel
属性productGUID为整数
属性productName作为字符串
楼价翻番
属性productSku为字符串
属性类别作为字符串()
属性ShipsWithin可为null(整数的)
属性productWebDescription作为字符串
属性ImageMainPath作为字符串
末级
公共类ProductViewModel
公共产品摘要作为ProductSummaryModel
末级

我创建了productsummary的一个新实例,因为我得到的是空实例预期值。是的,类别来自表单字段。。。为了简单起见,我没有发布这一部分。ProductSummary本身就是我的viewmodel中的一个对象,但是当我尝试访问我的viewmodel时,我遇到了一个异常。Spock,我以前就是这样做的,问题是…我有多个选项卡,每个选项卡本身都是一个局部视图。每个选项卡将包含自己的ViewModel,然后我将通过DB将我的主模型(ProductViewModel)发送到,而不是传递多个/单独的ViewModel。在包含部分视图的主视图中,使用Inherits=“System.Web.Mvc.ViewPage(属于MVCAPApplication2.ProductViewModel)”。您的局部视图使用我发布的上述解决方案。当您从主视图中将其称为部分视图时,例如Html.RenderPartial(“\u yourProductSummaryPartialView,Model.ProductSummaryModel”)。当然,在您的部分视图@Page Language=“VB”MasterPageFile=“~/Views/Shared/Site.Master”Inherits=“System.Web.Mvc.ViewPage(属于mvcapapplication2.ProductSummaryModel)”%%>中,这里有关于设置部分视图的更多信息是的,我这样做了,但现在当我尝试发布表单并尝试获取值时,我收到对象实例错误消息。这就是我的控制器的外观:公共函数AddItem(作为ProductViewModel的ByVal模型)作为ActionResult“将项添加到DB MsgBox(Model.ProductSummary.productName)哪一行获得对象实例错误?