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")
}