为什么我的模型无法被视图保存?

3

我一直在创建一些非常基础的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
}

对象p的所有字段值都具有默认值(零和空白)。

为什么?我做错了什么吗?

1个回答

5

在您的Purchase类中,使用属性而不是字段(更好的封装),最重要的是它们需要具有公共setter才能正常工作:

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

在你的例子中,你正在使用字段,但这些字段是内部的,因此你不能指望默认的模型绑定器能够为它们设置任何值,它们只会在你的POST操作中获得默认值。
话虽如此,这些属性没有被说出来的事实其实是你在代码中遇到的最小的问题。 在你的情况下,最糟糕的事情是你在视图中使用了Linq2Sql的模型,这是我看到人们在ASP.NET MVC应用程序中做的最严重的反模式之一。 你绝对应该使用视图模型。 这是应该从控制器传递到视图的视图,也是控制器从视图获取的内容。

3
抢先一步了……我正好要写出完全相同的回答! - SlackerCoder
1
谢谢,非常好的回答!现在,您能否解释一下为什么这是一个不好的做法作为对这个问题的回答:https://dev59.com/p1jUa4cB1Zd3GeqPT7VO - Shaul Behr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接