#c# #asp.net-mvc #variables #repository-pattern
Вопрос:
В этом методе я хочу проверить, var Total
не превышает ли переменная TotalMonths.
Проблема в том, что var Total
сообщение всегда принимается со значением, равным нулю, и я не понимаю, почему. Здесь метод:
/********EDIT MONTH DETAILS POST*********/ [HttpPost] [ValidateAntiForgeryToken] public IActionResult EditMonthDetail(BudgetViewModel budget) { //var Total = budget.FBudget.UnitPrice * budget.FBudget.Quantity; //budget.FBudget.TotalAmount = budget.FBudget.UnitPrice * budget.FBudget.Quantity; //var Total = _unitOfWork.Budget.Get(budget.FBudget.TotalAmount); var Total = BudgetVM.FBudget.TotalAmount; /*Always retrieved with 0*/ if (Total gt;= budget.FBudget.TotalMonths) { _unitOfWork.Budget.EditMonthDetails(BudgetVM.FBudget); _unitOfWork.Save(); return RedirectToAction("Success"); } return RedirectToAction("FailedTotal"); }
Вот как общее количество реализовано в модели:
public float TotalAmount { get { return UnitPrice * Quantity; } }
Вот представление с формой типа Post:
@{ Layout = "~/Views/Shared/_Layout.cshtml"; var title = "title"; } lt;form method="post" asp-action="EditMonthDetail"gt; lt;div class="row px-2 mx-2"gt; lt;div class="col-12"gt; @if (Model.FBudget.BudgetId != 0) { lt;input type="hidden" asp-for="FBudget.BudgetId" /gt; title = "Edit Month details"; } lt;br /gt; lt;h2 class="text-primary"gt;@titlelt;/h2gt; lt;/divgt; lt;br /gt; lt;div class="col-8"gt; lt;div class="form-group row"gt; lt;div class="col-4"gt; lt;label asp-for="FBudget.Jan"gt;lt;/labelgt; lt;/divgt; lt;div class="col-8"gt; lt;input asp-for="FBudget.Jan" class="form-control" /gt; lt;span asp-validation-for="FBudget.Jan" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;/divgt; lt;/divgt; lt;br /gt; lt;br /gt; lt;div class="col-8"gt; lt;div class="form-group row"gt; lt;div class="col-4"gt; lt;label asp-for="FBudget.Feb"gt;lt;/labelgt; lt;/divgt; lt;div class="col-8"gt; lt;input asp-for="FBudget.Feb" class="form-control" /gt; lt;span asp-validation-for="FBudget.Feb" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;/divgt; lt;/divgt; lt;br /gt; lt;br /gt; lt;div class="col-8"gt; lt;div class="form-group row"gt; lt;div class="col-4"gt; lt;label asp-for="FBudget.Mar"gt;lt;/labelgt; lt;/divgt; lt;div class="col-8"gt; lt;input asp-for="FBudget.Mar" class="form-control" /gt; lt;span asp-validation-for="FBudget.Mar" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;/divgt; lt;/divgt; lt;br /gt; lt;br /gt; lt;div class="col-8"gt; lt;div class="form-group row"gt; lt;div class="col-4"gt; lt;label asp-for="FBudget.Apr"gt;lt;/labelgt; lt;/divgt; lt;div class="col-8"gt; lt;input asp-for="FBudget.Apr" class="form-control" /gt; lt;span asp-validation-for="FBudget.Apr" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;/divgt; lt;/divgt; lt;br /gt; lt;br /gt; lt;div class="col-8"gt; lt;div class="form-group row"gt; lt;div class="col-4"gt; lt;label asp-for="FBudget.May"gt;lt;/labelgt; lt;/divgt; lt;div class="col-8"gt; lt;input asp-for="FBudget.May" class="form-control" /gt; lt;span asp-validation-for="FBudget.May" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;/divgt; lt;/divgt; lt;br /gt; lt;br /gt; lt;div class="col-8"gt; lt;div class="form-group row"gt; lt;div class="col-4"gt; lt;label asp-for="FBudget.Jun"gt;lt;/labelgt; lt;/divgt; lt;div class="col-8"gt; lt;input asp-for="FBudget.Jun" class="form-control" /gt; lt;span asp-validation-for="FBudget.Jun" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;/divgt; lt;/divgt; lt;br /gt; lt;br /gt; lt;div class="col-8"gt; lt;div class="form-group row"gt; lt;div class="col-4"gt; lt;label asp-for="FBudget.Jul"gt;lt;/labelgt; lt;/divgt; lt;div class="col-8"gt; lt;input asp-for="FBudget.Jul" class="form-control" /gt; lt;span asp-validation-for="FBudget.Jul" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;/divgt; lt;/divgt; lt;br /gt; lt;br /gt; lt;div class="col-8"gt; lt;div class="form-group row"gt; lt;div class="col-4"gt; lt;label asp-for="FBudget.Ago"gt;lt;/labelgt; lt;/divgt; lt;div class="col-8"gt; lt;input asp-for="FBudget.Ago" class="form-control" /gt; lt;span asp-validation-for="FBudget.Ago" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;/divgt; lt;/divgt; lt;br /gt; lt;br /gt; lt;div class="col-8"gt; lt;div class="form-group row"gt; lt;div class="col-4"gt; lt;label asp-for="FBudget.Sept"gt;lt;/labelgt; lt;/divgt; lt;div class="col-8"gt; lt;input asp-for="FBudget.Sept" class="form-control" /gt; lt;span asp-validation-for="FBudget.Sept" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;/divgt; lt;/divgt; lt;br /gt; lt;br /gt; lt;div class="col-8"gt; lt;div class="form-group row"gt; lt;div class="col-4"gt; lt;label asp-for="FBudget.Oct"gt;lt;/labelgt; lt;/divgt; lt;div class="col-8"gt; lt;input asp-for="FBudget.Oct"class="form-control" /gt; lt;span asp-validation-for="FBudget.Oct" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;/divgt; lt;/divgt; lt;br /gt; lt;br /gt; lt;div class="col-8"gt; lt;div class="form-group row"gt; lt;div class="col-4"gt; lt;label asp-for="FBudget.Nov"gt;lt;/labelgt; lt;/divgt; lt;div class="col-8"gt; lt;input asp-for="FBudget.Nov"class="form-control" /gt; lt;span asp-validation-for="FBudget.Nov" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;/divgt; lt;/divgt; lt;br /gt; lt;br /gt; lt;div class="col-8"gt; lt;div class="form-group row"gt; lt;div class="col-4"gt; lt;label asp-for="FBudget.Dec"gt;lt;/labelgt; lt;/divgt; lt;div class="col-8"gt; lt;input asp-for="FBudget.Dec"class="form-control" /gt; lt;span asp-validation-for="FBudget.Dec" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;/divgt; lt;/divgt; lt;br /gt; lt;br /gt; lt;div class="col-8"gt; lt;div class="form-group row"gt; lt;div class="col-8 offset-4"gt; lt;button type="submit" class="btn btn-primary form-control"gt;Updatelt;/buttongt; lt;/divgt; lt;/divgt; lt;/divgt; lt;/divgt; lt;/formgt;
I also tried to create a GetTotalAmount()
method in the repository but it doesn’t seems to work.
What am I doing wrong here?
EDIT
Here is the model:
namespace SalesBudget.Models { public class FBudget { [Key] public int BudgetId { get; set; } [Required(ErrorMessage = "Year is required.")] public int Year { get; set; } [Required(ErrorMessage = "FoC is required.")] public string FreeOfCharge { get; set; } [Required(ErrorMessage = "Currency is required.")] public string Currency { get; set; } [Required(ErrorMessage = "Unit price is required.")] [Display(Name = "Unit Price")] public float UnitPrice { get; set; } public int Jan { get; set; } public int Feb { get; set; } public int Mar { get; set; } public int Apr { get; set; } public int May { get; set; } public int Jun { get; set; } public int Jul { get; set; } public int Ago { get; set; } public int Sept { get; set;} public int Oct { get; set; } public int Nov { get; set; } public int Dec { get; set; } public int TotalMonths { get { return Jan Feb Mar Apr May Jun Jul Ago Sept Oct Nov Dec; } } [Display(Name = "Month Nr")] [Required(ErrorMessage = "Month Nr is required.")] [Range(1, 12, ErrorMessage = "The value must be between 1 and 12!")] public string MonthNr { get; set; } [Display(Name = "Unit of Measure")] [Required(ErrorMessage = "Unit of Measure is required.")] public string UnitOfMeasure { get; set; } [Display(Name = "Quantity")] [Required(ErrorMessage = "Quantity in untis is required.")] public int Quantity { get; set; } public float TotalAmount { get { return UnitPrice * Quantity; } } public string LastUser { //automatically set the last user that used the app get; set; } public int ProgramId { //automatically set the last sw that used the app get; set; } public DateTime LastUpdate { get; set; } = DateTime.Now; //FKs //Access to ItemMaster [Display(Name = "Item")] public int ItemMasterId { get; set; } public ItemMaster ItemMaster { get; set; } //Access to Company [Display(Name = "Company")] public int CompanyId { get; set; } public Company Company { get; set; } //Access to LedgerType [Display(Name = "Scenario")] public int LedgerTypeId { get; set; } public LedgerType LedgerType { get; set; } //Access to Customer [Display(Name = "Customer")] public int CustomerId { get; set; } public Customer Customer { get; set; } } }
А вот и модель представления:
namespace SalesBudget.Models.ViewModels { public class BudgetViewModel { public FBudget FBudget { get; set; } public IEnumerablelt;FBudgetgt; RecordsList { get; set; } public IEnumerablelt;SelectListItemgt; ItemNumberList { get; set; } public IEnumerablelt;SelectListItemgt; ItemDescriptionList { get; set; } public IEnumerablelt;SelectListItemgt; PharmaFormList { get; set; } public IEnumerablelt;SelectListItemgt; ProductGroupList { get; set; } public IEnumerablelt;SelectListItemgt; CompanyList { get; set; } public IEnumerablelt;SelectListItemgt; LedgerTypeList { get; set; } public IEnumerablelt;SelectListItemgt; LedgerScenarioList { get; set; } public IEnumerablelt;SelectListItemgt; CustomerList { get; set; } public IEnumerablelt;SelectListItemgt; LicensingAreaList { get; set; } public IEnumerablelt;SelectListItemgt; YearsList { get; set; } public IEnumerablelt;SelectListItemgt; CurrencyList { get; set; } } }
Комментарии:
1. К вашему сведению, это не нужно
set
, если это просто вычисленное значение. И вы проверили значенияUnitPrice
иQuanity
и является ли одно из них 0?2. Я не вижу вашей модели, и я тоже не вижу ничего о сумме в представлении.
3. @Serge сумма не в этом представлении, потому что она мне здесь не нужна. Но мне нужно сохранить это значение, чтобы сравнить его с TotalAmount, когда будет выполнен запрос post
4. @juharr Да, я знаю, я пытался кое-что сделать. Цена за единицу и количество не равны 0. С помощью отладчика я вижу, что в этой переменной хранится значение.
5. @chdev почему вы используете в своем контроллере BudgetVM вместо бюджета? это может быть вашей проблемой
Ответ №1:
решенный
Я забыл добавить скрытые поля ввода в представление, чтобы получить нужные мне значения:
lt;div class="col-12"gt; @if (Model.FBudget.BudgetId != 0) { lt;input type="hidden" asp-for="FBudget.BudgetId" /gt; lt;input type="hidden" asp-for="FBudget.Quantity" /gt; lt;input type="hidden" asp-for="FBudget.UnitPrice" /gt; lt;input type="hidden" asp-for="FBudget.TotalAmount" /gt; title = "Edit Month details"; } lt;br /gt; lt;/divgt;
Поэтому теперь, когда форма отправлена, значения записываются со скрытыми полями.