Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ASP.net MVC 3中使用模型项和表单输入进行简单计算?_Asp.net_Asp.net Mvc 3 - Fatal编程技术网

如何在ASP.net MVC 3中使用模型项和表单输入进行简单计算?

如何在ASP.net MVC 3中使用模型项和表单输入进行简单计算?,asp.net,asp.net-mvc-3,Asp.net,Asp.net Mvc 3,我对编程和ASP.net MVC 3还不熟悉,所以不要对我缺乏这方面的知识感到惊讶。。好的,我想乘以两个小数,一个小数来自用户填写的表单,另一个小数来自模型类(从数据库获取) 我有两个模型类,叫做RATE&PROJECTMATERIAL。RATE类有一个名为Amount的项,该项说明了一个RATE的金额,而PROJECTMATERIAL类有一个名为quantity的项。这些类是相关的,我希望能够说variable1=quantity*Rates.amount并将variable1返回到我的索引、

我对编程和ASP.net MVC 3还不熟悉,所以不要对我缺乏这方面的知识感到惊讶。。好的,我想乘以两个小数,一个小数来自用户填写的表单,另一个小数来自模型类(从数据库获取)

我有两个模型类,叫做RATE&PROJECTMATERIAL。RATE类有一个名为Amount的项,该项说明了一个RATE的金额,而PROJECTMATERIAL类有一个名为quantity的项。这些类是相关的,我希望能够说variable1=quantity*Rates.amount并将variable1返回到我的索引、删除、详细信息视图。我不想将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; }
}

Thanx提前,伙计们!!确实需要您的帮助。

您可以将属性添加到您的
项目材料中
模型:

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

您可能希望有一个模型函数,其中包含从视图传递的self.rate和self.material项的实例。或者,您可以单独计算每个视图中的乘法值

无论哪种方式,您都应该能够在视图的包中存储乘法值(variable1)的副本,并将其传递到每个视图,而无需将其保存在数据库中

ViewBag.variable1 = rate*material
return View()

正如你所说,你是MVC新手,我给了你一些选择,并解释了哪个是最好的以及为什么,因为现在更好地理解它,这样你就不会养成坏习惯,特别是当你开始构建更大的项目时

您不一定需要创建变量,因为您可以在视图中进行计算。因为您将域模型直接传递给视图,您可以执行以下操作(在razor中):

虽然这是最简单的选择,但我不一定推荐它,因为视图应该是哑的-请参阅

另一个选项是在控制器中进行计算并在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不是强类型的-请参阅

您可以像这样在
ProjectMaterial
类上放置一个属性,这是一个简洁的解决方案

public decimal Price
{
    get
    {
        return Quantity * Rates.Amount;
    }
}
但是,如果
Price
是一个仅在视图中使用的属性(即仅显示它),那么它可能不应该出现在域模型中,因为域模型就是存储和访问原始数据的属性


也许最好的方法是创建一个特定于视图的viewmodel(请参见),并带有价格属性。这意味着该属性仅在需要时使用,域模型保持不变,视图保持哑,域模型不向视图公开。有关视图模型的详细说明,请参见。除了可以在模型类中使用
数据格式字符串
,以及在视图中使用
Html帮助程序
,通过修改控制器中的返回属性来维护数字类型显示结果中的格式之外,还可以使用其他答案

@(int.Parse(variable) * your value) 
在模型类中应用格式、在控制器中应用值转换并保持视图标准的目的是实现关注点分离(SoC),以便于维护和控制代码

考虑这个例子:

产品类别属性

[Display(Name = "Max Disc %")]
[DisplayFormat(DataFormatString = "{0:P1}", ApplyFormatInEditMode = true)]
public decimal MaxDiscountRate { get; set; }
产品控制器

        [HttpGet]
        public ActionResult Details(int id)
        {
            if (id == 0)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Products products = _uow.Products.GetById(id);
            if (products == null)
            {
                return HttpNotFound();
            }
            else
            {
                products.MaxDiscountRate /= 100;
            }

            return View(products);
        }
产品详细信息视图

<div class="detail">
   <h5 class="text-teal">@Html.DisplayNameFor(model => model.MaxDiscountRate)</h5>
   <span class="text-peru">@Html.DisplayFor(model => model.MaxDiscountRate)</span>
</div>

@DisplayNameFor(model=>model.MaxDiscountRate)
@DisplayFor(model=>model.MaxDiscountRate)

不清楚您想做什么。您是在尝试计算控制器中的总计并将其传递回视图,还是在尝试计算控制器中的总计并使其可用于所有其他视图?Thanx,我想计算结果并将其传递给所有其他视图(索引、详细信息和删除)除了编辑视图,因为总数将是一个计算值..我之前尝试过这个,它看起来可以工作,因为所有的项目材质视图看起来都很好,但是每次我创建一个新的项目材质时,我都收到一个空引用异常错误。它抱怨说Rates.Amount为空,这是不真实的,因为我填充了Rates表,非常感谢!!!我想要最好的方法,我现在正在阅读你的链接,我尝试了一个在(昨天)之前我在ProjectMaterial类中放置属性的方法,但它对我来说不起作用,每次我创建一个新的项目材料时,我都会得到一个空引用异常,因为Rates.Amount为NULL,我意识到这是一个逻辑错误,因为我知道这不是真的,因为Rates表已填充。又是一次非常多!!当我们需要在razor视图中乘以字符串值时,我们可以这样使用。
        [HttpGet]
        public ActionResult Details(int id)
        {
            if (id == 0)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Products products = _uow.Products.GetById(id);
            if (products == null)
            {
                return HttpNotFound();
            }
            else
            {
                products.MaxDiscountRate /= 100;
            }

            return View(products);
        }
<div class="detail">
   <h5 class="text-teal">@Html.DisplayNameFor(model => model.MaxDiscountRate)</h5>
   <span class="text-peru">@Html.DisplayFor(model => model.MaxDiscountRate)</span>
</div>