Entity framework 在发布父模型之前更新相关列表-MVC 5 EF 6

Entity framework 在发布父模型之前更新相关列表-MVC 5 EF 6,entity-framework,asp.net-mvc-5,asp.net-ajax,action,renderpartial,Entity Framework,Asp.net Mvc 5,Asp.net Ajax,Action,Renderpartial,我敢肯定这是个彻头彻尾的问题。我目前与两个主要实体打交道: 请求-发送给采购部门的请求,详细说明与采购请求相关的信息 namespace Purchasing.Models { public class Request { public long ID { get; set; } [DisplayName("Total")] [Required] public decimal total { get; set; } [DisplayName("Date

我敢肯定这是个彻头彻尾的问题。我目前与两个主要实体打交道:

请求-发送给采购部门的请求,详细说明与采购请求相关的信息

namespace Purchasing.Models
{
public class Request
{
    public long ID { get; set; }

    [DisplayName("Total")]
    [Required]
    public decimal total { get; set; }

    [DisplayName("Date Created")]
    public DateTime dateCreated { get; set; }

    [DisplayName("Date Updated")]
    public DateTime dateModified { get; set; }

    [DisplayName("Reason for Purchase")]
    [Required]
    public string justification { get; set; }

    [Required]
    //[ForeignKey("User_ID")]
    public string userID { get; set; }

    [DisplayName("Current Status")]
    public Enums.RequestStatus status { get; set; }

    [DisplayName("Items")]
    [Required]
    public virtual ICollection<RequestLine> RequestLines { get; set; }

    [DisplayName("Budget")]
    [Required]
    public long budgetID { get; set; }
}

public class RequestDbContext : DbContext
{
    public RequestDbContext() : base("RequestDbContext")
    {
    }

    public static RequestDbContext Create()
    {
        return new RequestDbContext();
    }

    public DbSet<Request> Requests { get; set; }

    public System.Data.Entity.DbSet<RequestLine> RequestLines { get; set; }

    public System.Data.Entity.DbSet<Budget> Budgets { get; set; }
}
}
我试图实现的是一个视图,在发布请求之前,可以将请求行添加到请求中

请求控制器:

// GET: Request/Create
        public ActionResult Create()
        {
            string userID = User.Identity.GetUserId();
            ApplicationUser currentUser = userDb.Users.FirstOrDefault(x => x.Id == userID);

            if(currentUser != null)
            {
                ViewData["UserFullName"] = currentUser.FirstName + " " + currentUser.LastName;
                ViewData["UserDepartment"] = currentUser.Department.ToString();
            }

            Request request = new Request();
            request.dateCreated = DateTime.Now;
            request.RequestLines = new List<RequestLine>();

            request.userID = currentUser.Id.ToString();

            return View(request);
        }

// POST: Request/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "ID,total,dateCreated,dateModified,justification,userID,status,RequestLines")] Request request)
        {
            if (ModelState.IsValid)
            {
                request.status = Enums.RequestStatus.New;

                foreach (RequestLine reqLine in request.RequestLines)
                {

                    request.total += reqLine.amount;
                    reqLine.requestID = request.ID;
                    db.RequestLines.Add(reqLine);
                }

                db.Requests.Add(request);
                db.SaveChanges();

                return RedirectToAction("Index");
            }

            return View(request);
        }
//获取:请求/创建
公共操作结果创建()
{
字符串userID=User.Identity.GetUserId();
ApplicationUser currentUser=userDb.Users.FirstOrDefault(x=>x.Id==userID);
如果(currentUser!=null)
{
ViewData[“UserFullName”]=currentUser.FirstName+“”+currentUser.LastName;
ViewData[“UserDepartment”]=currentUser.Department.ToString();
}
请求=新请求();
request.dateCreated=DateTime.Now;
request.RequestLines=新列表();
request.userID=currentUser.Id.ToString();
返回视图(请求);
}
//POST:请求/创建
[HttpPost]
[ValidateAntiForgeryToken]
公共操作结果创建([Bind(Include=“ID,total,dateCreated,dateModified,justification,userID,status,RequestLines”)]请求请求)
{
if(ModelState.IsValid)
{
request.status=Enums.RequestStatus.New;
foreach(request.RequestLines中的RequestLine-RequestLine)
{
request.total+=requline.amount;
reqLine.requestID=request.ID;
db.RequestLines.Add(请求行);
}
db.Requests.Add(请求);
db.SaveChanges();
返回操作(“索引”);
}
返回视图(请求);
}
最终,我尝试实现的是一个创建请求的视图,该视图允许用户为请求创建请求行,并在发布整个请求之前将其显示在创建视图中

Request/Create.cshtml(表现在按角度显示,但不执行后端数据绑定)

@model Purchasing.Models.Request
@using Purchasing.Models

@{
ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Create</h2>


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

<div class="form-horizontal" ng-controller="reqLineCtrl">
    <h4>Request</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })

    <div class="form-group">
        <div class="col-md-2">
            <b>@ViewData["UserFullName"]</b>
        </div>
        <div class="col-md-2">
            <b>@ViewData["UserDepartment"]</b>
        </div>
        <div class="col-md-2">
        </div>
        <div class="col-md-2">
            <b>@Model.dateCreated.ToString("MM/dd/yyyy")</b>
        </div>
    </div>
    <hr/>

    <div class="form-group">
        <div class="col-md-2">
            <label class="control-label" for="items">Items</label>
        </div>
        <div class="col-md-10">
            <table class="table" id="items">
                <caption><b>Request Total: ${{total | currency}}</b></caption>
                <tr>
                    <th>Description</th>
                    <th>Quantity</th>
                    <th>Price</th>
                    <th>Total</th>
                </tr>
                <tr ng-repeat="reqLine in lines">
                    <td>{{reqLine.description}}</td>
                    <td>{{reqLine.quantity}}</td>
                    <td>{{reqLine.price | currency}}</td>
                    <td>{{reqLine.price * reqLine.quantity | currency}}</td>
                </tr>
            </table>
        </div>
    </div>

    <div class="form-inline">
        <div class="form-group col-md-2">
            <label class="control-label col-md-6" for="quantity">Quantity</label>
            <div class="col-md-6">
                <input type="text" id="quantity" class="form-control" ng-model="line.quantity">
            </div>
        </div>

        <div class="form-group col-md-5">
            <label class="control-label col-md-2" for="description">Description</label>
            <div class="col-md-10">
                <input type="text" id="description" class="form-control" ng-model="line.description">
            </div>
        </div>

        <div class="form-group col-md-2">
            <label class="control-label col-md-6" for="price">Price</label>
            <div class="col-md-6">
                <input type="text" id="price" class="form-control" ng-model="line.price">
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="button" value="Add Item" class="btn btn-primary" ng-click="enterLine(line)"/>
            </div>
        </div>
    </div>
    <br/>
    <hr/>


    <div class="form-group">
        @Html.LabelFor(model => model.justification, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.justification, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.justification, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-primary" />
        </div>
    </div>
</div>


}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
@model Purchasing.Models.Request
@使用采购模型
@{
ViewBag.Title=“创建”;
Layout=“~/Views/Shared/_Layout.cshtml”;
}
创造
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
要求

@Html.ValidationSummary(true,“,new{@class=“text danger”}) @ViewData[“UserFullName”] @ViewData[“用户部门”] @Model.dateCreated.ToString(“MM/dd/yyyy”)
项目 请求总数:${Total | currency} 描述 量 价格 全部的 {{reqLine.description}} {{requline.quantity} {{reqLine.price | currency} {{reqLine.price*reqLine.quantity | currency}} 量 描述 价格

@LabelFor(model=>model.justification,htmlAttributes:new{@class=“controllabel col-md-2”}) @EditorFor(model=>model.justification,new{htmlAttributes=new{@class=“form control”}) @Html.ValidationMessageFor(model=>model.justification,“,new{@class=“text danger”}) } @ActionLink(“返回列表”、“索引”) @节脚本{ @Scripts.Render(“~/bundles/jqueryval”) }
我找到了许多关于Html.RenderPartial、Html.Action、Ajax.BeginForm()的教程我还没能真正让它们适应我想要完成的任务。我并不反对发送JsonResults。我正在开发一个平均堆栈应用程序,我没有这些问题,所以我对JSON很满意。最终,我知道必须有一种更干净、更标准的方法来完成这项工作,因为这似乎是一种常见的操作web应用程序的开发


我不想承认,但我已经在这一点上坚持了三个星期,我的大部分时间都花在了教程上,试图找到一个解决方案。任何帮助都将不胜感激,即使它只是向我指出一个教程,它实际上有我需要的答案。

如果我正确理解你的问题,MVC的答案是你的
ng-repeat
应替换为一个C#
foreach
,该C#
foreach可遍历
RequestLine
列表并显示它们。您需要创建一个显示模板和/或编辑器模板,以便可以使用
Html.DisplayFor()
和/或
Html.EditorFor()
和MVC将知道如何显示每个
RequestLine
。从角度来说,您的显示或编辑器模板就是
ng repeat
中的任何模板

如果您想创建一个新的
RequestLine
,而不需要访问服务器,那么您需要javascript复制一个现有的,清除字段并将其添加到列表中。MVC没有规定任何具体的方法,因为它是一个服务器端MVC框架,而不是像Angular这样的客户端框架

如果您希望在客户端代码中使用Angular,则不应使用ASP.NET MVC。两者不会混合使用。ASP.NET MVC假定模型位于服务器上(因此,迭代项的方式是使用
foreach@model Purchasing.Models.Request
@using Purchasing.Models

@{
ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Create</h2>


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

<div class="form-horizontal" ng-controller="reqLineCtrl">
    <h4>Request</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })

    <div class="form-group">
        <div class="col-md-2">
            <b>@ViewData["UserFullName"]</b>
        </div>
        <div class="col-md-2">
            <b>@ViewData["UserDepartment"]</b>
        </div>
        <div class="col-md-2">
        </div>
        <div class="col-md-2">
            <b>@Model.dateCreated.ToString("MM/dd/yyyy")</b>
        </div>
    </div>
    <hr/>

    <div class="form-group">
        <div class="col-md-2">
            <label class="control-label" for="items">Items</label>
        </div>
        <div class="col-md-10">
            <table class="table" id="items">
                <caption><b>Request Total: ${{total | currency}}</b></caption>
                <tr>
                    <th>Description</th>
                    <th>Quantity</th>
                    <th>Price</th>
                    <th>Total</th>
                </tr>
                <tr ng-repeat="reqLine in lines">
                    <td>{{reqLine.description}}</td>
                    <td>{{reqLine.quantity}}</td>
                    <td>{{reqLine.price | currency}}</td>
                    <td>{{reqLine.price * reqLine.quantity | currency}}</td>
                </tr>
            </table>
        </div>
    </div>

    <div class="form-inline">
        <div class="form-group col-md-2">
            <label class="control-label col-md-6" for="quantity">Quantity</label>
            <div class="col-md-6">
                <input type="text" id="quantity" class="form-control" ng-model="line.quantity">
            </div>
        </div>

        <div class="form-group col-md-5">
            <label class="control-label col-md-2" for="description">Description</label>
            <div class="col-md-10">
                <input type="text" id="description" class="form-control" ng-model="line.description">
            </div>
        </div>

        <div class="form-group col-md-2">
            <label class="control-label col-md-6" for="price">Price</label>
            <div class="col-md-6">
                <input type="text" id="price" class="form-control" ng-model="line.price">
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="button" value="Add Item" class="btn btn-primary" ng-click="enterLine(line)"/>
            </div>
        </div>
    </div>
    <br/>
    <hr/>


    <div class="form-group">
        @Html.LabelFor(model => model.justification, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.justification, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.justification, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-primary" />
        </div>
    </div>
</div>


}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}