- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开展一个项目,使用 ASP.NET MVC 5 帮助学生和导师选择下学期的最佳类(class)。第一步是让学生从列表中选择他已经选修的类(class)。显示列表的 Controller 是:
public ActionResult AddCourseVM (int? id)
{
Student student = db.Students.Find(id);
// List<BaseCourse> potentialCourses = student.StudentConcentration.RequiredCourses.ToList();
List<BaseCourse> potentialCourses = db.BaseCourses.ToList();
AddCourseViewModel vModel = new AddCourseViewModel(student, potentialCourses);
List<Course> listCourses = new List<Course>();
foreach(BaseCourse baseC in potentialCourses)
{
Course c = new Course();
c.BaseCourse = baseC;
c.Student = student;
listCourses.Add(c);
}
vModel.PossibleCourses = listCourses;
return View("AddCourseVM", vModel);
}
ViewModel 是:
public class AddCourseViewModel
{
public Student Student { get; set; }
public List<BaseCourse> AvailCourses { get; set; }
public List<Course> PossibleCourses { get; set; }
public AddCourseViewModel(Student s, List<BaseCourse> c)
{
Student = s;
AvailCourses = c;
PossibleCourses = new List<Course>();
}
public AddCourseViewModel()
{
Student = new Student();
AvailCourses = new List<BaseCourse>();
PossibleCourses = new List<Course>();
}
}
Course 对象是类(class)的特定实例(对于给定的学生,在某个学期等),BaseCourse 对象是类(class)目录中的各个类(class)。
我正在使用此 View 在列表中显示可能的类(class):
@model CMPSAdvising.ViewModels.AddCourseViewModel
@{
ViewBag.Title = "AddCourseVM";
}
<h2>Add Courses</h2>
<div>
<p>Name: @Model.Student.FirstName @Model.Student.LastName</p>
<p>W#: @Model.Student.WNumber</p>
</div>
<div>
<p>Select the Courses You Have Taken</p>
</div>
<div>
@using (Html.BeginForm("AddCourseVM","Students"))
{
@Html.AntiForgeryToken();
<div>
<table class="table table-bordered">
<tr>
<th>Course</th>
<th>Department</th>
<th>Number</th>
<th>Check if Taken</th>
<th>Semester</th>
<th>Grade</th>
</tr>
@foreach (var course in Model.PossibleCourses)
{
<tr>
<td>@course.BaseCourse.Name</td>
<td>@course.BaseCourse.CourseNumber</td>
<td>@course.BaseCourse.CourseNumber</td>
<td>@Html.CheckBoxFor(s => course.Selected)</td>
<td>@Html.TextBoxFor(m => course.Semester)</td>
<td>@Html.TextBoxFor(g => course.Grade)</td>
</tr>
}
</table>
<input type="submit" value="Save Classes Taken" class="btn btn-default" />
</div>
}
</div>
最后是当用户点击按钮时接收 POST 的 Controller :
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddCourseVM (AddCourseViewModel vModel)
{
Student stu = vModel.Student;
foreach (Course c in vModel.PossibleCourses)
{
if (c.Selected)
{
stu.CoursesTaken.Add(c);
}
}
db.Entry(stu).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("ListTakenCourses", new { id = stu.ID });
}
我的问题是 AddCourseViewModel 对象 (vModel) 返回 null。我想从网页中获取 ViewModel 作为对象,或者至少获取已检查的类(class)列表和学生 ID。
最佳答案
我相信there is an app for that called the BeginCollectionItem HtmlHelper .是discussed briefly with references here , 并且基于 blog article written by Steve Sanderson a few years ago .
问题在于,模型与表单集合的绑定(bind)与 MVC 中的模型与标量输入的绑定(bind)并不完全相同。您的收藏需要一个索引器,as discussed here .如果它没有按预期绑定(bind),请检查呈现的表单输入的名称属性,并将它们与 post 模型(操作参数)类中的属性名称和结构进行比较。
从外观上看,看起来更像这样的 HTML 输出应该会导致 action 参数不为空:
<tr>
<td>HTTP 101</td>
<td>HTP-101</td>
<td>HTP-101</td>
<td><input type="checkbox" name="PossibleCourses[0].Selected" /></td>
<td><input type="text" name="PossibleCourses[0].Semester"></td>
<td><input type="text" name="PossibleCourses[0].Grade"></td>
</tr>
<tr>
<td>MVC 101</td>
<td>MVC-101</td>
<td>MVC-101</td>
<td><input type="checkbox" name="PossibleCourses[1].Selected" /></td>
<td><input type="text" name="PossibleCourses[1].Semester"></td>
<td><input type="text" name="PossibleCourses[1].Grade"></td>
</tr>
...等等,下面的 Razor 应该输出:
@for (var i = 0; i <= Model.PossibleCourses.Count; i++)
{
var course = Model.PossibleCourses[i];
<tr>
<td>@course.BaseCourse.Name</td>
<td>@course.BaseCourse.CourseNumber</td>
<td>@course.BaseCourse.CourseNumber</td>
<td>@Html.CheckBox(string.Format("PossibleCourses[{0}].Selected", i),
course.Selected)</td>
<td>@Html.TextBox(string.Format("PossibleCourses[{0}].Semester", i),
course.Semester)</td>
<td>@Html.TextBox(string.Format("PossibleCourses[{0}].Grade", i),
course.Grade)</td>
</tr>
}
请注意表单输入元素的名称属性如何对应于操作参数模型中的可索引 ( List<Course>
) 属性的名称,以及包含在集合中的索引 (Course
) 属性名称。这是一种通过使输入名称属性与方法参数属性名称匹配来帮助模型绑定(bind)器确定如何使用数据填充操作参数类实例的方法。
您还可以使用 GUID(或与此相关的任何字符串)作为索引器,这是 BeginItemCollection 内部所做的。以下内容还应该有助于模型绑定(bind)器能够填充操作参数,以便它不会作为 null 进入操作方法:
@foreach (var course in Model.PossibleCourses)
{
var indexer = Guid.NewGuid(); // or possibly course.CourseId
<tr>
<td>@course.BaseCourse.Name</td>
<td>@course.BaseCourse.CourseNumber</td>
<td>@course.BaseCourse.CourseNumber</td>
<td>@Html.Hidden("PossibleCourses.index", indexer)
@Html.CheckBox(string.Format("PossibleCourses[{0}].Selected", indexer),
course.Selected)</td>
<td>@Html.TextBox(string.Format("PossibleCourses[{0}].Semester", indexer),
course.Semester)</td>
<td>@Html.TextBox(string.Format("PossibleCourses[{0}].Grade", indexer),
course.Grade)</td>
</tr>
}
重要的是对应于 Action 参数类中的集合项的每组表单元素必须共享相同的索引器,并且索引器必须不同于对应于不同集合项的其他组表单元素 Action 参数类。 reading this question and its answer 可以理解此解决方案的示例.
关于c# - 将 HTML/Razor 表单中的集合数据发送/发布到 MVC 操作参数模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28786065/
我的公司正在尝试制定一些关于使用哪种技术来构建应用程序的指南。在做我的研究时,我感到很困惑。 似乎有 3 种 ASP.NET 技术。 MVC Razor Razor 页 MVC 对我来说相当清楚,因为
我正在尝试使用 Razor(来自预览版)将 MVC 项目升级到 Beta,现在我遇到了 Razor 没有进入它用来访问的登录 View 的奇怪现象(当有人要求执行需要授权的操作时)。 我的网络配置有
我想在 Razor 页面中包含一个类型化的模型子页面。我知道 SS 与 MVC Razor 不同。这样做的方式可能有些不同。 到目前为止,这就是我想出来的(看起来很丑,知道......): /
我在 Views 的同一个子文件夹中有两个 cshtml 文件。其中一个模板旨在包含另一个模板。我试图做到这一点,如下所示: 主模板: @Html.Partial("~/View
尝试通过部分将模型对象呈现为 JSON 结构,如下所示: @if( Model.IsEmpty ) { @( Model.UseNull ? "null" : "" ) } else {
现在我有下一个并且它有效 @foreach (TestLogs.Repository.DatabaseModel.Platforms CurrentPlatform in Model.Appl
我想知道如何在 Razor Pages 2.1 中创建和分配角色。应用。 我已经找到了如何为 MVC 应用程序( How to create roles in asp.net core and ass
我正在使用 Razor Engine from CodePlex在控制台应用程序中。当我在 VS 2010 IDE 中以 Debug模式运行时,一切正常。从 shell 来看,即使是上述 CodePl
我正在学习 ServiceStack razor 并希望更好地使用它(一般是 ServiceStack),但我无法让智能感知在模型上工作(通过继承指令) 这是我到目前为止的尝试:http://www.
如何在 Razor 辅助方法中包含不间断空格 ( )?这是有问题的助手: @helper RenderClipResult(Clip clip, IList searchTerms) {
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 6年前关闭。 Improve this questi
我有一些 Razor 页面,其中包含大量条件逻辑、循环、部分 View 等。保持输出标记在语义上正确很容易,但使用正确的缩进和换行符对其进行格式化则更困难。我怎样才能在运行时自动执行此操作?有模块或
我有: @: 但它呈现为 ...lesson_icon/d40d2ff2-d06b-4fd8-80a0-0ed31bbc04eb%20.png 如何去掉.png前面的%20? 最佳答案 文件扩展名前
我有 6 个相同内容类型“新闻”的项目,在每个项目中我都有一个字段 newsIntro。我想将特定页面中的字段放在另一个页面上,因此我需要定位特定字段,因此它可能是节点 1702 上的 newsInt
是否有任何支持自动完成的 Razor 模板 (.cshtml) 的轻量级编辑器? 或任何支持 Razor 自动完成的 Notepad++、Sublime Text 2 等插件? 最佳答案 自上次测试版
有没有办法在 Razor View 引擎中创建类似的函数? @{ View.Title = "Clients"; private string GetRowClassName(RowS
我有一个名为 item 的对象,item 有一个属性 itemId。我正在尝试建立一个包含 itemId 后跟 .html 的网址...所以它看起来像“myNiftyItem-123456.html”
我想知道如何在 Razor Pages (Page.cshtml) 中获取路由值。 前任。https://localhost:44320/AdminPanel/Admins如果我使用 MVC,我会将这
如何在 F# 项目中使用 ServiceStack.Razor? 我添加了对 ServiceStack.Razor 的引用(这似乎在 Windows 上没有问题,但出于某种原因在 Mac 上的 Mon
通过Ctrl+E、D格式化这部分代码: if (row % 3 == 0) { @: } 给我: if (row % 3 == 0) { @:
我是一名优秀的程序员,十分优秀!