在MVC上保存多个孩子

时间:2015-08-23 04:16:31

标签: asp.net-mvc-5 parent-child

我在为MVC 5需要保存多个孩子的概念上遇到了一些麻烦。该实体来自每日的货币对图表,它将是父母。而我需要它来创建父母,让我们说欧元/美元,然后分配可以是一,二或十的重要级别。所以我知道我可以创建父母,然后在其他步骤创建孩子,但它不是非常“友好”,因为它必须为许多货币对和每天做。我想知道是否有一种方法可以在一个页面中完成所有这些操作。我不知道我是否清楚我想要什么,但作为一个概念,我认为这就像在博客中添加标签,你创建“博客文章”并在同一页面添加标签,但你不知道这篇文章会有多少标签。

这是我的模特

public class Pair
{
    public int pairID { get; set; }
    public string name { get; set; }
    public DateTime Date { get; set; }
    public virtual IEnumerable<Levels> Levels { get; set; }
}

public class Levels
{
    public int levelID { get; set; }
    public double Value { get; set; }
    public string comment { get; set; }
    public int pairID { get; set; }
    public virtual Pair Pair { get; set; }
}

2 个答案:

答案 0 :(得分:0)

我可以通过两种方式来实现您的目标:

  • 如果您想要的子记录数量有限,则可以在不使用任何Levels的情况下实现此目的。

实施例

此示例仅允许您按Pair添加5 Levels。如果您愿意,只需更改以下代码即可增加Levels = Enumerable.Range(1, 5).Select(i => new Levels()).ToList();

的数量
public class Pair
{
    public Pair()
    {
        Levels = Enumerable.Range(1, 5).Select(i => new Levels()).ToList();
    }  
    ....
}

public class Levels
{
    ....
}

<强>模型

[HttpGet]
public ActionResult ExampleParentChild()
{
    return View(new Pair());
}

[HttpPost]
public ActionResult ExampleParentChild(Pair pair)
{
    if (ModelState.IsValid)
    {
        context.Pairs.Add(pair);
        context.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(pair);
}

<强>控制器

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    @Html.LabelFor(m=> m.Date)
    @Html.EditorFor(m=>m.Date)

    @foreach(var item in Model.Levels)
    {
        @Html.LabelFor(m=> item.Value)
        @Html.EditorFor(m=> item.Value)

        @Html.LabelFor(m=> item.comment)
        @Html.EditorFor(m=> item.comment)
    }

    <input type="submit" value="Create" />
}

查看

JavaScript
  • 如果您希望子记录的数量是动态的,则必须使用input才能在运行中向页面添加更多jQuery个元素。您可以使用AngularJSAngularJS。我向您提供了使用WEB APIAngularJs的示例,我向您提供AngularJS示例的原因是您要求在单个页面中执行此操作并且每个人都使用{@ 1}}现在是SPA。

示例:

<强> AngularController

angular.module('Pair', [])
    .controller('PairController', PairController);
function AccountController($http) {
    vm.Pair = {};
    vm.Pair.Levels = []
    vm.addLevel = function(){
        if (vm.Pair.Levels)
        {
            vm.Pair.Levels.push({});
        }
    };
    vm.savePair = function () {
        $http.post('/api/PairsApi/', vm.Pair).success(function (data) {
            vm.Pair = {};
        }).error(function (data) {
            // code for error
        });
    };
};

<强>的WebAPI

[Route("api/PairApi/{id?}", Name = "api_PairApi")]
public class PairLedgersApiController : ApiBaseController 
{
    DbContext _db = new DbContext();
    public IHttpActionResult PostPairLedger(Pair pair)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        _db.Pairs.Add(pair);
        _db.Save();

        return CreatedAtRoute("api_PairApi", new { id = pair.Id }, Pair);
    }
.....
}

查看

<div data-ng-app="Pair" data-ng-controller="PairController as vm">
    <form name="PairForm" ng-submit="vm.savePair()" novalidate>
        <div class="form-body">
            <label>Name</label>
            <input type="text" name="pairName" ng-model="vm.Pair.name " class="form-control"/>

            <label>Date</label>
            <input type="date" name="pairDate" ng-model="vm.Pair.Date" value="{{vm.Pair.Date | date: 'yyyy-MM-dd'}}" class="form-control"/>

            <div ng-repeat="level in vm.Pair.Levels">
                <label>Value</label>
                <input type="text" name="levelValue" ng-model="level.value" class="form-control"/>

                <label>Comment</label>
                <input type="text" name="levelComment" ng-model="level.comment" class="form-control"/>
            </div>
            <input type="submit" value="Save" class="btn blue" />
            <button ng-click="vm.addLevel();" class="btn blue">
                Add Level
            </button>
        </div>
    </form>
</div>

如果您是AngularJS的新用户,可以参考以下链接,将其与ASP .NET MVC一起使用:

Build a Single Page Application (SPA) with ASP.NET Web API and Angular.js

CRUD with SPA, ASP.NET Web API and Angular.js

答案 1 :(得分:-1)

public long Save(INVStoreTrans model, int userId, string pageUrl)
    {
        long CurrentTransactionID = 0;

        try
        {
            using (TransactionScope transaction = new TransactionScope())
            {

                using (_context)
                {
                    var GetTransactionNo = DalCommon.GetPreDefineNextCodeByUrl(pageUrl);

                    if (GetTransactionNo != null)
                    {
                        #region New_Transaction_Insert

                        INV_StoreTrans objIssue = new INV_StoreTrans();

                        objIssue.TransactionNo = GetTransactionNo;
                        objIssue.TransactionDate = DalCommon.SetDate(model.TransactionDate);
                        objIssue.TransactionCategory = "ISU";
                        objIssue.TransactionType = "STI";
                        objIssue.TransactionFrom = model.IssueFrom;
                        objIssue.TransactionTo = model.IssueTo;

                        objIssue.TransactionStatus = "TRI";


                        objIssue.RecordStatus = "NCF";
                        objIssue.SetBy = userId;
                        objIssue.SetOn = DateTime.Now;

                        _context.INV_StoreTrans.Add(objIssue);
                        _context.SaveChanges();
                        CurrentTransactionID = objIssue.TransactionID;
                        #endregion

                        #region Item Insert
                        if (model.TransactionItemList != null)
                        {
                            foreach (var item in model.TransactionItemList)
                            {
                                INV_StoreTransItem objItem = new INV_StoreTransItem();

                                objItem.TransactionID = CurrentTransactionID;

                                objItem.ItemID = item.ItemID;
                                objItem.SupplierID = item.SupplierID;

                                objItem.TransactionQty = item.IssueQty;

                                objItem.TransactionUnit = DalCommon.GetUnitCode(item.IssueUnitName);


                                objItem.PackSize = DalCommon.GetSizeCode(item.IssuePackSizeName);
                                objItem.SizeUnit = DalCommon.GetUnitCode(item.IssueSizeUnitName);


                                objItem.PackQty = item.IssuePackQty;
                                //objItem.ItemSource = DalCommon.ReturnItemSource(item.ItemSource);
                                objItem.SetOn = DateTime.Now;
                                objItem.SetBy = userId;

                                _context.INV_StoreTransItem.Add(objItem);
                                //_context.SaveChanges();
                            }

                        }
                        #endregion
                    }
                    _context.SaveChanges();

                }
                transaction.Complete();
            }
            return CurrentTransactionID;
        }
        catch (Exception e)
        {
            return 0;
        }
    }