为什么我的模型没有被视图保存

本文关键字:视图 保存 我的 模型 为什么 | 更新日期: 2023-09-27 18:00:25

我一直在制作一些非常基本的MVC视图来保存一些数据。到目前为止,我已经将它们全部基于LinqToSql类;现在,我第一次基于我自己创建的一个简单的小类创建了一个表单,称为Purchase

public class Purchase {
  long UserID;
  decimal Amount;
  string Description;
}

创建了一个如下所示的视图:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<TestViewer.Models.Purchase>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
  Test Purchase
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
  <h2>
    Test Purchase</h2>
  <% using (Html.BeginForm("SavePurchase", "Home")) {%>
  <%: Html.ValidationSummary(true) %>
  <fieldset>
    <legend>Fields</legend>
    <div class="editor-label">
      <%: Html.LabelFor(model => model.UserID) %>
    </div>
    <div class="editor-field">
      <%: Html.DropDownListFor(model => model.UserID, 
    SystemUser.Select(u=>new SelectListItem{ Text=u.UserName, Value=u.ID.ToString()}).OrderBy(s=>s.Text))%>
      <%: Html.ValidationMessageFor(model => model.UserID) %>
    </div>
    <div class="editor-label">
      <%: Html.LabelFor(model => model.Amount) %>
    </div>
    <div class="editor-field">
      <%: Html.TextBoxFor(model => model.Amount) %>
      <%: Html.ValidationMessageFor(model => model.Amount) %>
    </div>
    <div class="editor-label">
      <%: Html.LabelFor(model => model.Description) %>
    </div>
    <div class="editor-field">
      <%: Html.TextBoxFor(model => model.Description) %>
      <%: Html.ValidationMessageFor(model => model.Description) %>
    </div>
    <p>
      <input type="submit" value="Create" />
    </p>
  </fieldset>
  <% } %>
  <div>
    <%: Html.ActionLink("Back to List", "Index") %>
  </div>
</asp:Content>

但当我回到HomeController:中的代码时

public ActionResult SavePurchase(Purchase p) {
   // code here
}

对象CCD_ 3具有用于其所有字段值的默认值(零和空白)。

为什么?我做错了什么?

为什么我的模型没有被视图保存

Purchase类中,使用属性而不是字段(为了更好地封装),最重要的是,它们需要公共设置器才能工作:

public class Purchase 
{
    public long UserID { get; set; }
    public decimal Amount { get; set; }
    public string Description { get; set; }
}

在您的示例中,您使用的是字段,但这些字段是内部,因此您不能期望默认模型绑定器能够为它们设置任何值,它们只是在POST操作中获得默认值。

话虽如此,但这些属性并没有被提及,这是您在使用此代码时遇到的最小问题。在您的情况下,最糟糕的是您在视图中使用了Linq2Sql模型,这是我在ASP.NET MVC应用程序中看到的最糟糕的反模式之一。您绝对应该使用视图模型。这就是应该从控制器传递的视图,也是控制器应该从视图获得的视图。