Как сделать простые вычисления, используя элементы модели и вход из формы в ASP.net MVC 3? - PullRequest
6 голосов
/ 19 января 2012

Я новичок в программировании и ASP.net MVC 3, так что не удивляйтесь моему отсутствию знаний по этому вопросу. Хорошо, я хочу умножить два знака после запятой, один десятичный от формы, заполняемой пользователем, а другойдесятичное число поступает из класса Model (получает его из базы данных).

У меня есть два класса Model с именем RATE & PROJECTMATERIAL.В классе RATE есть элемент с именем Сумма , в котором указывается сумма ставки, а в классе PROJECTMATERIAL есть элемент количество .Классы связаны, и я хочу иметь возможность сказать переменная1 = количество * Rates.amount и вернуть переменную1 в мои представления Индекс, Удалить, Подробности.Я не хочу хранить variable1 в моей базе данных, но я просто хочу отобразить в своих представлениях ..... но я не знаю, как и где это сделать

Код из класса материалов проекта ..

public class ProjectMaterial
{
    public int ProjectMaterialID { get; set; }

    [Required]
    [Display(Name = "Scope Name")]
    public int? ScopeID { get; set; }

    [Required]
    [Display(Name = "Rate Code")]
    public int? RateID { get; set; }

    [Required]
    [Display(Name = "Quantity")]
    public decimal Quantity { get; set; }


    public virtual Scope Scopes { get; set; }
    public virtual Rate Rates { get; set; }

}

Код из класса области видимости.

public class Rate
{
    public int RateID { get; set; }


    [Required]
    [Display(Name = "Rate Code")]
    public int RateCode { get; set; }

    [Required]
    [Display(Name = "Unit")]
    public string Unit { get; set; }

    [Required]
    [Display(Name = "Description")]
    public string Description { get; set; }

    [Required]
    [Display(Name = "Amount")]
    public decimal Amount { get; set; }

    public virtual ICollection<ProjectMaterial> ProjectMaterials { get; set; }
}

Код из класса контроллера проекта ...

public class ProjectMaterialController : Controller
{
    private ContructorContext db = new ContructorContext();

    //
    // GET: /ProjectMaterial/

    public ViewResult Index()
    {
        var projectmaterials = db.ProjectMaterials.Include(p => p.Scopes).Include(p => p.Rates);

        return View(projectmaterials.ToList());
    }



    //
    // GET: /ProjectMaterial/Details/5

    public ViewResult Details(int id)
    {
        ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id);
        return View(projectmaterial);
    }

    //
    // GET: /ProjectMaterial/Create

    public ActionResult Create()
    {
        ViewBag.ScopeID = new SelectList(db.Scopes, "ScopeID", "ScopeName");
        ViewBag.RateID = new SelectList(db.Rates, "RateID", "Unit");
        return View();
    } 

    //
    // POST: /ProjectMaterial/Create

    [HttpPost]
    public ActionResult Create(ProjectMaterial projectmaterial)
    {
        if (ModelState.IsValid)
        {
            db.ProjectMaterials.Add(projectmaterial);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }

        ViewBag.ScopeID = new SelectList(db.Scopes, "ScopeID", "ScopeName", projectmaterial.ScopeID);
        ViewBag.RateID = new SelectList(db.Rates, "RateID", "Unit", projectmaterial.RateID);
        return View(projectmaterial);
    }

    //
    // GET: /ProjectMaterial/Edit/5

    public ActionResult Edit(int id)
    {
        ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id);
        ViewBag.ScopeID = new SelectList(db.Scopes, "ScopeID", "ScopeName", projectmaterial.ScopeID);
        ViewBag.RateID = new SelectList(db.Rates, "RateID", "Unit", projectmaterial.RateID);
        return View(projectmaterial);
    }

    //
    // POST: /ProjectMaterial/Edit/5

    [HttpPost]
    public ActionResult Edit(ProjectMaterial projectmaterial)
    {
        if (ModelState.IsValid)
        {
            db.Entry(projectmaterial).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.ScopeID = new SelectList(db.Scopes, "ScopeID", "ScopeName", projectmaterial.ScopeID);
        ViewBag.RateID = new SelectList(db.Rates, "RateID", "Unit", projectmaterial.RateID);
        return View(projectmaterial);
    }

    //
    // GET: /ProjectMaterial/Delete/5

    public ActionResult Delete(int id)
    {
        ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id);
        return View(projectmaterial);
    }

    //
    // POST: /ProjectMaterial/Delete/5

    [HttpPost, ActionName("Delete")]
    public ActionResult DeleteConfirmed(int id)
    {            
        ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id);
        db.ProjectMaterials.Remove(projectmaterial);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

Заранее спасибо, ребята !!очень нужна твоя помощь.

Ответы [ 4 ]

7 голосов
/ 19 января 2012

Поскольку вы говорите, что вы новичок в MVC, я дал вам несколько вариантов и объяснил, какой из них лучше и почему, потому что лучше понять сейчас, чтобы вы не получили вредных привычек, особенно если вы начать строить большие проекты.

Вам не обязательно создавать переменную, потому что вы можете сделать это в своем представлении. Поскольку вы передаете модель домена непосредственно представлению, которое вы можете сделать (в бритве):

@(Model.Quantity * Model.Rates.Amount)

Хотя это самый простой вариант, я не обязательно рекомендую его, поскольку представления должны быть тупыми - см. ASP.NET MVC: насколько глупо должно быть мое представление? .

Другой вариант - выполнить вычисления в контроллере и передать значение в ViewBag, например ::

.
public ViewResult Details(int id)
{
    ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id);
    ViewBag.Price = projectmaterial.Quantity * projectmaterial.Rates.Amountl
    return View(projectmaterial);
}

Тогда вы можете использовать его в своем представлении как:

@ViewBag.Price

Опять же, это легко, но я бы не рекомендовал его, поскольку ViewBag не является строго типизированным - см. Плохо ли использовать ViewBag в MVC? .

Вы можете поместить свойство в свой класс ProjectMaterial как, что является изящным решением.

public decimal Price
{
    get
    {
        return Quantity * Rates.Amount;
    }
}

Однако, если Price - это свойство, которое когда-либо использовалось только в ваших представлениях (то есть вы просто отображаете его), то, вероятно, его не должно быть в вашей доменной модели, поскольку ваша доменная модель - это просто хранение и доступ необработанные данные.

Возможно, лучший способ - создать модель представления, специфичную для вашего представления (см. http://stephenwalther.com/blog/archive/2009/04/13/asp.net-mvc-tip-50-ndash-create-view-models.aspx) с использованием свойства Price. Это означает, что свойство используется только там, где оно необходимо, модель домена остается именно такой, ваша представление остается тупым, и модель вашего домена не предоставляется вашему виду. См. Почему два класса, модель представления и модель домена? также для хорошего объяснения моделей представления

2 голосов
/ 19 января 2012

Вы можете добавить свойство к вашей ProjectMaterial модели:

public decimal Price
{
    get
    {
        return Quantity * Rates.Amount;
    }
}
0 голосов
/ 25 ноября 2018
@(int.Parse(variable) * your value) 
0 голосов
/ 19 января 2012

Возможно, вы захотите иметь функцию модели с экземплярами вашего self.rate и элементами self.material, передаваемыми из ваших представлений. Или иначе вы можете индивидуально рассчитать значения умножения в каждом представлении.

В любом случае, вы должны иметь возможность хранить копию со значением умножения (variable1) в сумке представления и передавать ее на каждое представление без необходимости сохранять ее в БД.

ViewBag.variable1 = rate*material
return View()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...