Asp.net mvc Asp MVC将计算结果从jQuery绑定到模型

Asp.net mvc Asp MVC将计算结果从jQuery绑定到模型,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-2,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 2,我正在使用ASP.NETMVC3 我有文本框,我有一个控件,显示这些文本框总和的计算值。我使用jQuery来计算这些结果 我正在努力与后回来,然后总被清除,我不知道如何才能保留计算结果。所以我认为,如果我的视图模型中有一个属性,那么它将保留回发时的值。我尝试使用Html.TextboxFor来计算总数,当我单击submit按钮时,这个值似乎保持不变。但我不希望它是一个文本框,只是文本,但我仍然需要它绑定到视图模型 我的视图模型的一部分: public class EditGrantApplica

我正在使用ASP.NETMVC3

我有文本框,我有一个控件,显示这些文本框总和的计算值。我使用jQuery来计算这些结果

我正在努力与后回来,然后总被清除,我不知道如何才能保留计算结果。所以我认为,如果我的视图模型中有一个属性,那么它将保留回发时的值。我尝试使用Html.TextboxFor来计算总数,当我单击submit按钮时,这个值似乎保持不变。但我不希望它是一个文本框,只是文本,但我仍然需要它绑定到视图模型

我的视图模型的一部分:

public class EditGrantApplicationViewModel
{
   public decimal? GrossMonthlySalary { get; set; }
   public decimal? SpouseGrossMonthlySalary { get; set; }
   public decimal? AdditionalIncome { get; set; }
   public decimal? ChildSupportIncome { get; set; }
   public decimal? TotalMonthlyIncome
   {
      get { return totalMonthlyIncome; }
      set
      {
         totalMonthlyIncome = GrossMonthlySalary +
            SpouseGrossMonthlySalary +
            AdditionalIncome +
            ChildSupportIncome;
      }
   }
}
我的HTML的一部分:

<td><label>Gross Monthly Salary:</label> <span class="red">**</span></td>
<td>@Html.TextBoxFor(x => x.GrossMonthlySalary, new { @class = "income", maxlength = "10", size = "20" })
   @Html.ValidationMessageFor(x => x.GrossMonthlySalary)
</td>

<td><label>Spouse Gross Monthly Salary:</label></td>
<td>@Html.TextBoxFor(x => x.SpouseGrossMonthlySalary, new { @class = "income", maxlength = "10", size = "20" })
   @Html.ValidationMessageFor(x => x.SpouseGrossMonthlySalary)
</td>

<td><label>Any Additional Income:</label></td>
<td>@Html.TextBoxFor(x => x.AdditionalIncome, new { @class = "income", maxlength = "10", size = "20" })
   @Html.ValidationMessageFor(x => x.AdditionalIncome)
</td>

<td><label>Child Support Received:</label></td>
<td>@Html.TextBoxFor(x => x.ChildSupportIncome, new { @class = "income", maxlength = "10", size = "20" })
   @Html.ValidationMessageFor(x => x.ChildSupportIncome)
</td>

<td><label class="total">Total Monthly Income:</label></td>
<td>
   <label id="TotMonthlyIncome" class="total-amount">@Html.DisplayTextFor(x => x.TotalMonthlyIncome)</label>
   @Html.HiddenFor(x => x.TotalMonthlyIncome)
</td>

当我在文本框中输入一个值时,它会正确计算。如果我在4个文本框中输入值,则计算正确。如果我在其中一个文本框中输入一个值,则TotalMonthlyIncome为空,但当所有4个文本框中都有值时,则它具有文本框的附加值。为什么要这样做?在我的代码中是否有不正确的地方?

您可以创建隐藏输入并将其与viewmodel属性绑定

<%: Html.HiddenFor(m => m.CalculatedValue) %>
<div id="DisplayCalculatedValue"><%: Model.CalculatedValue %></div>

<script type="text/javascript">
var value = // calculate it
$('#CalculatedValue').val(value);
$('#DisplayCalculatedValue').html(value);
</script>
m.CalculatedValue)%%>
var value=//计算它
$('#CalculatedValue').val(值);
$('#DisplayCalculatedValue').html(value);

TotalMonthlyIncome
属性的设置器中,您必须考虑小数可能为空:

private decimal? totalMonthlyIncome;
public decimal? TotalMonthlyIncome
{
    get { return totalMonthlyIncome; }
    set
    {
        totalMonthlyIncome =
            (GrossMonthlySalary.HasValue ? GrossMonthlySalary.Value : 0m) +
            (SpouseGrossMonthlySalary.HasValue ? SpouseGrossMonthlySalary.Value : 0m) +
            (AdditionalIncome.HasValue ? AdditionalIncome.Value : 0m) +
            (ChildSupportIncome.HasValue ? ChildSupportIncome.Value : 0m);
    }
}

你的代码不起作用。我需要将计算结果显示为用户在文本框中键入的内容。我通过jQuery来实现这一点。您的第二行代码只显示了值,我需要动态计算。@Brendan Vogt,您可以调整jQuery代码,以便除了更新显示的值之外,还可以更新隐藏字段值。@Darin但问题是它在回发时丢失了值。你有没有给我一些示例代码?总数只是为了显示给用户,我不会保存到数据库中。我只是认为,通过将总计绑定到模型,将使其保持其状态。正如@Darin Dimitrov所说,您应该使用计算值更新隐藏字段。这对我来说是显而易见的。我想我应该说得更具体些。我更新了我的答案。@Darin:这里发生了什么,我没有让它正常工作。我已经更新了我原来的帖子。谢谢。HasValue和Value属性仅适用于可空类型吗?@Brendan Vogt,它仅适用于您正在使用的
System.nullable
类型。
private decimal? totalMonthlyIncome;
public decimal? TotalMonthlyIncome
{
    get { return totalMonthlyIncome; }
    set
    {
        totalMonthlyIncome =
            (GrossMonthlySalary.HasValue ? GrossMonthlySalary.Value : 0m) +
            (SpouseGrossMonthlySalary.HasValue ? SpouseGrossMonthlySalary.Value : 0m) +
            (AdditionalIncome.HasValue ? AdditionalIncome.Value : 0m) +
            (ChildSupportIncome.HasValue ? ChildSupportIncome.Value : 0m);
    }
}