如何注射"属性及其对象的值

时间:2013-06-21 15:20:03

标签: c# asp.net-mvc-4

目标

将一个属性及其值“注入”一个对象。

问题

我有以下由Entity Framework 5创建的对象:

public partial class getSpecificProductToShoppingList_Result
{
    public string productName { get; set; }
    public string measureAbbreviation { get; set; }
}

我正在使用Session创建购物清单,当用户在其列表中添加内容时,应用程序会调用一个过程来获取有关此产品的信息,这些信息将分别填充上述属性。

重点是:用户可以添加他想要的产品数量 - 这不是数据库的责任。

要添加产品,用户必须访问MyApp.com/Products/Add?productId=1&quantity=5。我可以使用以下方法检索有关产品的所有信息:

ShoppingListController.cs

public ActionResult Add(Nullable<int> productId, int quantity)
{
    if (Session["ShoppingList"] == null)
    {
        Session["ShoppingList"] = new 
           List<getSpecificProductToShoppingList_Result>();
    }

    getSpecificProductToShoppingList_Result product = 
      Products.BuildItemToShoppingList(productId);

    ((List<getSpecificProductToShoppingList_Result>)Session["ShoppingList"])
      .Add(product);

    return View("Index");
}

然后, 视图

@foreach (var item in 
    (List<MyApp.Models.Data.getSpecificProductToShoppingList_Result>)
    Session["ShoppingList"])
{
    <p>@item.productName | @item.measureAbbreviation</p>
}

我的问题很简单:如何添加@item.quantity等内容?

我在想什么

我正在考虑这样的事情(注意产品变量声明之后的行):

public ActionResult Add(Nullable<int> productId, int quantity)
{
    if (Session["ShoppingList"] == null)
    {
        Session["ShoppingList"] = 
          new List<getSpecificProductToShoppingList_Result>();
    }

    getSpecificProductToShoppingList_Result product = 
      Products.BuildItemToShoppingList(productId);

    ((List<getSpecificProductToShoppingList_Result>)Session["ShoppingList"])
      .Insert(productId, 
         new KeyValuePair<string, int>("quantity", quantity))
      .Add(product);

    return View("Index");
}

但是 - 当然 - 没有成功。语法错误,但只是为了说明。

详细

我正在使用C#.Net + MVC 4 + Razor Engine

1 个答案:

答案 0 :(得分:1)

在与实体框架模型相同的命名空间中,即。放置.edmx文件的同一文件夹,创建一个与实体框架中定义的类名相同的新类,我认为在这种情况下是getSpecificProductToShoppingList_Result

将该类标记为部分,您可以向其添加自己的属性。

例如:你在.edmx设计器文件中有这个:

    [EdmEntityTypeAttribute(NamespaceName="YourModel", Name="getSpecificProductToShoppingList_Result")]
    [Serializable()]
    [DataContractAttribute(IsReference=true)]
    public partial class getSpecificProductToShoppingList_Result : EntityObject
    {
...
    }

这是自动生成的,你不能改变它来添加一些属性,但是它被标记为部分可以让你扩展它,例如。如果我补充:

public partial class getSpecificProductToShoppingList_Result
{
    public int Quantity {get; set; }
}

C#将它们连接在一起,所以在我的控制器中,我可以做到

var something = new List<getSpecificProductToShoppingList_Result>();

something.First().quantity = 50;

数量不属于getSpecificProductToShoppingList_Result,因为这是我的数据库类型,但我已经通过部分类添加了它。