【发布时间】:2014-03-31 14:14:57
【问题描述】:
我正在尝试保存下面的项目模型
public partial class Project: BaseModel
{
public Project()
{
ProjectUsers = new List<ProjUser>();
}
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
[Display(Name="Project ID")]
public int ProjectID { get; set; }
[Required]
public string Title { get; set; }
[Display(Name = "Users")]
public virtual List<ProjUser> ProjectUsers { get; set; }
}
ProjUser 模型
public partial class ProjUser: BaseModel
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ProjUserID { get; set; }
public int UserID { get; set; }
public int ProjectID { get; set; }
[ForeignKey("ProjectID")]
public virtual Project Project { get; set; }
public bool? Signatories { get; set; }
}
用户通过单独的数据库填充,项目和用户之间的链接通过 ProjUser 模型、UserID 值维护。
public partial class User : BaseModel
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserID { get; set; }
[Required]
[Display(Name = "dispUserName" , ResourceType = typeof(Resource))]
public string UserName { get; set; }
}
在视图中,我将用户列表填充为可选 (JqueryUI) 并选择项目中可用的用户。
@model Impetro.Models.Project
@{
ViewBag.Title = "ProjectSettings";
}
<h2>@ViewBag.Title</h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Project Settings</legend>
@Html.HiddenFor(model => model.ProjectID)
<div>
<div class="editor-label">
@Html.LabelFor(model => model.Title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Title)
</div>
</div>
</fieldset>
<p>
<input type="submit" value="Save" />
</p>
}
<h3>@Html.DisplayNameFor(model => model.ProjectUsers)</h3>
@{
var pojectUserIDs = from pu in Model.ProjectUsers
select new { pu.UserID };
String userIDstr = "";
foreach (var user in pojectUserIDs)
{
userIDstr = userIDstr + "#" + user.UserID.ToString() + ";";
}
}
@Html.Hidden("userValues", userIDstr, "id='userValues'")
<table data-impetro-uitype="selectable" data-impetro-selectorvalues="#userValues" id="projUserGrd">
@foreach (var user in ViewBag.Users as IEnumerable<Impetro.Models.Global.User>)
{
<tr id="@user.UserID" class="ui-widget-content"><td>@user.UserName</td> <td>@Html.CheckBox("chk" + @user.UserID) @Html.Label("chk" + @user.UserID, "PO Signatory")</td></tr>
}
</table>
将上表转换为可选的JS并选择已经添加的用户。
$(function () {
$("[data-impetro-uitype='selectable']").bind("mousedown", function (e) {
e.metaKey = true;
})
.selectable({
filter: "tr",
create: function (event, ui) {
var selectable = $(this);
var valueEle = selectable.attr("data-impetro-selectorvalues");
var valArr = $(valueEle).val().split(";");
for (var i = 0; i < valArr.length; i++) {
if (valArr[i] == "") {
continue;
}
var id = valArr[i];
selectable.find(id).addClass("ui-selected");
}
}
});
});
如何在模型中捕获对 projusers 列表的更改? 顺便说一句:有没有更简单的方法来选择初始加载本身的值,它支持跟踪 projUser 列表的变化
提前致谢
根据 lnanikian 的要求,这里是控制器的 GET 操作。我仍然没有为此编写 POST 操作,因为我仍然对如何继续将详细信息保存到列表中存有疑问。
public ActionResult ProjectSettings(int id)
{
ViewBag.Users = userRepository.All;
return View(projectRepository.All
.Where(p => p.ProjectID == id).SingleOrDefault());
}
【问题讨论】:
-
您想在服务器端更新您为项目选择的用户的模型吗?
-
是的,项目需要使用用户 ID 和签名信息进行更新(添加/删除/更新)。
-
我们可以在
Controller中看到Action吗?此外,在您的表单之后,您可以将第二部分放在部分视图中,并且您会将代码不在视图中。最好分开层。 -
@lnanikian 我已经添加了到目前为止我已经完成的操作。是的,我同意将第二部分放在单独的局部视图中会很好,但是因为我计划将选定的用户包含在表单中并将其发送回服务器。我保持同样的观点。如果我能找到一种方法在同一个 post 方法中发送详细信息并保存它,那么在局部视图中就可以了...
标签: c# asp.net-mvc-4 jquery-ui-selectable