- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我正在做一个网络应用程序,遇到了一个新的挑战,我已经坚持了几周。我将提供有关我的应用程序和数据模型的背景信息,以及所需的最终结果。
基本应用信息和问题背景:我的应用程序旨在用作景观承包商可以用来帮助管理其业务运营的工具。我的应用程序将提供一个他们可以创建帐户的地方,然后输入他们所有的客户信息(“客户”数据模型),以及他们为每个客户所做的工作的信息(“工作”数据模型) .客户和作业之间存在一对多的关系(一个客户可以有多个作业,但对于任何给定的作业只能有一个客户)。
背景:我有两个简单的数据模型,“Client”和“Job”。我的应用程序是在 ASP.net MVC3 框架中构建的。使用 Entity Framework 脚手架机制,我为每个数据模型(创建、读取、更新、删除)创建了基本的 CRUD View 。这在很大程度上非常好(我可以创建新的客户和工作,并很容易地编辑现有的)。
业务问题:我需要允许在我的应用程序中为新工作批量创建。我希望我的用户(景观承包商)能够输入他们当天完成的所有割草工作。因此,我希望我对这个过程的看法用所有活跃的客户填充一个表——每个客户在行旁边都有一个复选框。然后我希望用户能够为他们为每个客户做新工作(修剪他们的草坪)选中复选框,并提交表格(输入完成的工作),结果将为这些客户中的每一个创建新工作.
技术问题:我最好的猜测是我需要在 Controller 中创建一个自定义 ViewModel 并将其发送到 View ,其中 ViewModel 将是基于当前事件客户端创建的新作业列表。然后在 View 中,复选框可以将 Client_ID(客户端的唯一标识符)作为它们的值(这将是 ViewModel 的一部分。当用户提交表单时, View 会将 ViewModel 传回 Controller 。然后是 Controller 可以遍历 ViewModel 作业列表并为选中复选框的每个 ViewModel 作业创建一个新作业。
所以,我的问题是 - 如何使用 Controller 执行以下操作:1.) 根据客户端列表(“客户端”数据模型)中的数据在运行时构建 ViewModel 作业列表?2.) 我怎样才能把它传递给 View ?3.) 一旦它返回到 Controller ,我如何遍历列表并相应地修改我的其他数据模型(创建新的“作业”项)?
我创建了自定义 ViewModel,其中包含构建新工作条目所需的客户和工作的属性(客户名称、客户地址、客户 ID、工作说明、工作人员、工作人员人数、工作时间、用于指示的复选框完成等)。假设用户有 50 个客户,他为这些客户修剪草坪,这些客户是活跃客户。我想构建一个包含 50 行的 ViewModel(代表每个可能需要修剪草坪的客户)。然后我想将其发送到 View 并使用复选框显示它,这表明草坪是否被切割。当模型返回到 View 时, Controller 将获取带有复选框的行,并在该表中创建新的“作业”行。
提前感谢您提供的任何帮助,我知道这对你们中的许多人来说可能很容易。我是 C# 和 MVC3 的新手。
更新:这是我的代码-
工作模式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
namespace LawnTracker.Models
{
public class Job
{
[Key]
public int Job_ID { get; set; }
public int Client_ID { get; set; }
public int Account_ID { get; set; }
public string Name { get; set; }
public string Location { get; set; }
public string Notes { get; set; }
public string SvcRoute { get; set; }
public string Service { get; set; }
public string Date { get; set; }
public double SvcPriceOverride { get; set; }
public float SvcQty { get; set; }
public string UofM { get; set; }
public bool Invoiced { get; set; }
public string Crew { get; set; }
public int TechCount { get; set; }
public string TimeStart { get; set; }
public string TimeFinish { get; set; }
public double TimeSpent { get; set; }
public string Image1 { get; set; }
public string Image2 { get; set; }
public string Image3 { get; set; }
public double MulchUsed { get; set; }
public double FertUsed { get; set; }
public double HerbUsed { get; set; }
public string NextDue { get; set; }
}
}
我的 MowingJobViewModel 模型 -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace LawnTracker.Models
{
public class MowingJobViewModel
{
public int Client_ID { get; set; }
public bool Completed { get; set; }
public string Name { get; set; }
public string Street { get; set; }
public string City { get; set; }
public double SvcPriceOverride { get; set; }
public string UofM { get; set; }
public int SvcQty { get; set; }
public string Notes { get; set; }
public string Date { get; set; }
public string Crew { get; set; }
public int TechCount { get; set; }
public string SvcRoute { get; set; }
public string Schedule { get; set; }
}
}
还有我的 JobController -
// GET: /Job/CreateMowing
public ActionResult CreateMowing(string route = "", string sched = "")
{
List<SelectListItem> listItems = new List<SelectListItem>();
listItems.Add(new SelectListItem()
{
Value = "Lump Sum",
Text = "Lump Sum"
});
listItems.Add(new SelectListItem()
{
Value = "Hours",
Text = "Hours"
});
ViewBag.Units = new SelectList(listItems, "Value", "Text");
ViewBag.Routes = db.Clients.Select(r => r.SvcRoute).Distinct();
ViewBag.Sched = db.Clients.Select(r => r.MowSched).Distinct();
var model = from r in db.Clients
orderby r.SvcRoute
where (r.Mowing == true) &&
(r.Status == "Active") &&
(r.SvcRoute == route || (route == "")) &&
(r.MowSched == sched || (sched == ""))
select r;
if (model.Count() > 0)
{
ViewBag.total = model.Select(r => r.MowPrice).Sum();
}
else
{
ViewBag.total = 0.00;
}
/* Build a list of MowingJobViewModel objects based on the above defined list of clients
* who are subscribed to mowing and active. This will enable batch entry for new jobs done.
* This list of MowingJobViewModel objects will be sent to the client after a HTTP GET
* request for the CreateMowing view. The user will be able to check boxes associated
* with each client in the client list. When the form is submitted, the controller
* receives the model back with the updated information (completed, notes, etc.) about
* each job. Then the controller must update the jobs table, adding the new jobs based on
* the view model returned from the view / client.
*
*/
//Create a new list of MowingJobViewModel objects
IEnumerable<MowingJobViewModel> mjList = new List<MowingJobViewModel>();
//iterate through the list of clients built from earlier (in model)...
foreach (var item in model)
{
//create new MowingJobViewModel object MJ and add it to the list
mjList.Add(new MowingJobViewModel()
{
Client_ID = item.Client_ID,
Completed = false,
Name = (item.FirstName + " " + item.LastName),
Street = item.Address1,
City = item.City,
SvcPriceOverride = item.MowPrice,
UofM = "Lump Sum",
SvcQty = 1,
Notes = "",
Date = "",
Crew = "",
TechCount = 2,
SvcRoute = item.SvcRoute,
Schedule = item.MowSched,
});
}
return View(mjList);
}
**I don't have my view ("CreateMowing.cshtml") worked out correctly, but here is what I have-**
@model IEnumerable<LawnTracker.Models.MowingJobViewModel>
@{
ViewBag.Title = "Enter Mowing Jobs";
}
<h2>Enter Mowing Jobs</h2>
<div style="float: left; clear:both; width: 100%;">
<b>Total Jobs: @Html.Encode(Model.Count())</b><br />
<b>Total Revenue: $@Html.Encode(ViewBag.total)</b><br /><br />
</div>
<p></p>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<div style="float: right; clear:both; width: 100%;">
@using (Html.BeginForm("CreateMowing", "Job", FormMethod.Get))
{
<table>
<tr>
<th></th>
<th>
Route
</th>
<th>Schedule</th>
<th></th>
</tr>
<tr>
<td>
Show:
</td>
<td>
@Html.DropDownList("route", new SelectList(ViewBag.Routes), "--ALL--")
</td>
<td>
@Html.DropDownList("sched", new SelectList(ViewBag.Sched), "--ALL--")
</td>
<td>
<input type="submit" value="Filter" />
</td>
</tr>
</table><br /><br />
}
</div>
<table>
<tr>
<th>
Completed
</th>
<th>
First Name
</th>
<th>
Last Name
</th>
<th>
Street
</th>
<th>
City
</th>
<th>
Service Route
</th>
<th>
Price
</th>
<th>
Units
</th>
<th>
Qty
</th>
<th>
Notes
</th>
<th>
Schedule
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
<input type="checkbox" name="invoiced" value="@item.Client_ID" >
</td>
<td>
@Html.DisplayFor(modelItem => item.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Address1)
</td>
<td>
@Html.DisplayFor(modelItem => item.City)
</td>
<td>
@Html.DisplayFor(modelItem => item.SvcRoute)
</td>
<td>
@Html.DisplayFor(modelItem => item.MowPrice)
</td>
<td>
</td>
<td>
</td>
<td>
</td>
<td>
@Html.DisplayFor(modelItem => item.MowSched)
</td>
</tr>
}
</table>
<div>
<br />
@Html.ActionLink("Back to List", "Index")
</div>
最佳答案
您已经创建了一个 View 模型,其中包含创建作业时特定客户端的显示属性/数据输入字段。既然你没有给它起名字,我就叫它NewJobEntry
.如您所料,您现在需要一个具有 List<NewJobEntry>
类型属性的 View 模型表示可以同时创建的可变数量的新工作。
您的 Controller 将填充列表,添加一个 NewJobEntry
每个客户端的实例。
当提供包含列表的模型时,您的 View 可以枚举列表并为每个 NewJobEntry
生成一行.
一旦数据回发到您的 Controller ,默认的 ASP.NET MVC 绑定(bind)程序就可以处理列表,但存在一些问题。只要字段名称具有顺序索引,默认 Binder 将自动合并列表中的对象。为确保正确生成这些索引,您需要在具有顺序索引的 View 中使用 lambda 表达式进行绑定(bind):
Html.CheckboxFor(model => model.JobList[i].IsSelected)
您可以考虑使用 for
循环而不是 foreach
枚举列表时循环。
您还必须小心复选框,因为未选中的复选框实际上不会出现在发送到 Controller 的发布数据中。这将打破绑定(bind),因为在发布数据中发送的索引可能不再是连续的(只要有未选中的复选框就会有间隙)。因此,我建议您为客户端 ID 添加一个隐藏字段。这样一来,帖子数据将始终包含至少一个字段,其中每个列表条目都有适当的顺序索引。
Html.HiddenFor(model => model.JobList[i].ClientId)
现在您的帖子数据将类似于:
JobList_0_IsSelected=true
JobList_0_ClientId=12345
JobList_1_ClientId=12346
JobList_2_IsSelected=true
JobList_2_ClientId=12347
默认 Binder 将处理此问题并重建您的列表。请注意,如果没有客户端 ID 的隐藏字段,索引 1
将会丢失,并且默认 Binder 将无法正确重建列表。
希望对您有所帮助!
关于c# - 如何在运行时根据现有数据模型中的数据构建自定义的动态 ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13373052/
好的,所以我编辑了以下... 只需将以下内容放入我的 custom.css #rt-utility .rt-block {CODE HERE} 但是当我尝试改变... 与 #rt-sideslid
在表格 View 中,我有一个自定义单元格(在界面生成器中高度为 500)。在该单元格中,我有一个 Collection View ,我按 (10,10,10,10) 固定到边缘。但是在 tablev
对于我的无能,我很抱歉,但总的来说,我对 Cocoa、Swift 和面向对象编程还很陌生。我的主要来源是《Cocoa Programming for OS X》(第 5 版),以及 Apple 的充满
我正在使用 meta-tegra 为我的 NVIDIA Jetson Nano 构建自定义图像。我需要 PyTorch,但没有它的配方。我在设备上构建了 PyTorch,并将其打包到设备上的轮子中。现
在 jquery 中使用 $.POST 和 $.GET 时,有没有办法将自定义变量添加到 URL 并发送它们?我尝试了以下方法: $.ajax({type:"POST", url:"file.php?
Traefik 已经默认实现了很多中间件,可以满足大部分我们日常的需求,但是在实际工作中,用户仍然还是有自定义中间件的需求,为解决这个问题,官方推出了一个 Traefik Pilot[1] 的功
我想让我的 CustomTextInputLayout 将 Widget.MaterialComponents.TextInputLayout.OutlinedBox 作为默认样式,无需在 XML 中
我在 ~/.emacs 中有以下自定义函数: (defun xi-rgrep (term) (grep-compute-defaults) (interactive "sSearch Te
我有下表: 考虑到每个月的权重,我的目标是在 5 个月内分散 10,000 个单位。与 10,000 相邻的行是我最好的尝试(我在这上面花了几个小时)。黄色是我所追求的。 我试图用来计算的逻辑如下:计
我的表单中有一个字段,它是文件类型。当用户点击保存图标时,我想自然地将文件上传到服务器并将文件名保存在数据库中。我尝试通过回显文件名来测试它,但它似乎不起作用。另外,如何将文件名添加到数据库中?是在模
我有一个 python 脚本来发送电子邮件,它工作得很好,但问题是当我检查我的电子邮件收件箱时。 我希望该用户名是自定义用户名,而不是整个电子邮件地址。 最佳答案 发件人地址应该使用的格式是: You
我想减小 ggcorrplot 中标记的大小,并减少文本和绘图之间的空间。 library(ggcorrplot) data(mtcars) corr <- round(cor(mtcars), 1)
GTK+ noob 问题在这里: 是否可以自定义 GtkFileChooserButton 或 GtkFileChooserDialog 以删除“位置”部分(左侧)和顶部的“位置”输入框? 我实际上要
我正在尝试在主页上使用 ajax 在 magento 中使用 ajax 显示流行的产品列表,我可以为 5 或“N”个产品执行此操作,但我想要的是将分页工具栏与结果集一起添加. 这是我添加的以显示流行产
我正在尝试使用 PasswordResetForm 内置函数。 由于我想要自定义表单字段,因此我编写了自己的表单: class FpasswordForm(PasswordResetForm):
据我了解,新的 Angular 7 提供了拖放功能。我搜索了有关 DnD 的 Tree 组件,但没有找到与树相关的内容。 我在 Stackblitz 上找到的一个工作示例.对比drag'ndrop功能
我必须开发一个自定义选项卡控件并决定使用 WPF/XAML 创建它,因为我无论如何都打算学习它。完成后应该是这样的: 到目前为止,我取得了很好的进展,但还有两个问题: 只有第一个/最后一个标签项应该有
我要定制xtable用于导出到 LaTeX。我知道有些问题是关于 xtable在这里,但我找不到我要找的具体东西。 以下是我的表的外观示例: my.table <- data.frame(Specif
用ejs在这里显示日期 它给我结果 Tue Feb 02 2016 16:02:24 GMT+0530 (IST) 但是我需要表现为 19th January, 2016 如何在ejs中执行此操作?
我想问在 JavaFX 中使用自定义对象制作 ListView 的最佳方法,我想要一个每个项目如下所示的列表: 我搜了一下,发现大部分人都是用细胞工厂的方法来做的。有没有其他办法?例如使用客户 fxm
我是一名优秀的程序员,十分优秀!