我的问题是在哪里放置返回的表数据的逻辑。
我正在玩一个教程,为学生展示课程和注册。
这是屏幕上的数据
成绩标题姓氏
2.00经济学Tibbetts编辑|细节|删除
3.50经济学古兹曼编辑|细节|删除
4.00文学Catlett编辑|细节|删除
1.80文献Tibbetts编辑|细节|删除
3.20 Chemistry Tibbetts编辑|细节|删除
4.00化学古兹曼编辑|细节|删除
4.00文学皮特编辑|细节|删除
代码刚开始显示表数据
@foreach (var item in Model.Enrollments)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Course.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Grade)
</td>
<td>
@Html.DisplayFor(modelItem => item.Course.Credits)
</td>
</tr>
}
如果等级为&lt; = 2,我可以通过添加vars样式来更改tr背景红色 和style =“@ style”(在堆栈溢出时发现这个)
@foreach (var item in Model.Enrollments)
{
var style = item.Grade <= 2 ? "background-color:Red" : null;
<tr style="@style">
<td>
@Html.DisplayFor(modelItem => item.Course.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Grade)
</td>
<td>
@Html.DisplayFor(modelItem => item.Course.Credits)
</td>
</tr>
}
这是正确的,因为它在视图上,我将如何做更难的事情,例如删除经济学标题的删除操作,或者如果以“T”开头则不显示用户lastname
这一切都应该是在PartialView或控制器中,或两者兼而有之,以及如何做到这一点。
一个例子就是很棒。我想我只是不明白如何在数据到达视图之前按摩数据。
我是一位经典的asp doer转向MVC。我意识到应该有一个单独的代码,所以它不是像经典的意大利面,但我是一个新手,我很困惑如何这样做。 在过去,我会做一个if语句并执行逻辑,然后根据它执行asp和/或HTML。
答案 0 :(得分:0)
虽然没有严格的规则,但使用视图模型来表示要显示的内容将节省使用复杂代码污染视图并将逻辑保留在控制器中。你可以做的一个例子(你没有发布模型,你发布的视图与表格布局不匹配,所以我只是在猜测)
查看模型
public class CourseVM
{
public string Name { get; set; }
public IEnumerable<EnrollmentVM> Enrollments { get; set; }
}
public class EnrollmentVM
{
public int ID { get; set; }
public string Title { get; set; }
[DisplayFormat(DataFormatString="{0:0.00}")]
public decimal Grade { get; set }
public string LastName { get; set; }
public bool CanDelete { get; set; }
public string ClassName { get; set; }
}
控制器
public ActionResult Index(int ID)
{
var course = // get the course based on the ID
CourseVM model = new CourseVM();
{
Name = course.Name,
Enrollments = course.Enrollments.Select(e => new EnrollmentVM()
{
ID = e.ID,
Title = e.Title,
Grade = e.Grade,
LastName = e.LastName,
CanDelete = e.Title != "Economics",
ClassName = e.Grade < 2.0 ? "fail" : "pass"
})
};
return View(model);
}
查看
@model CourseVM
<h2>@Html.DisplayFor(m => m.Name)</h2>
<table>
<thead>
...
</thead>
<tbody>
@foreach(var enrollment in Model.Enrollments)
{
<tr class="@enrollment.ClassName">
<td>@Html.DisplayFor(m => enrollment.Grade)</td>
....
<td>@Html.ActionLink("Edit", "Edit", "Enrollment", new { ID = enrollment.ID }, null)</td>
<td>
if(enrollment.CanDelete)
{
@using(Html.BeginForm("Delete", "Enrollment", new { ID = enrollment.ID })
{
<input type="submit" class="deletelink" value="Delete" />
}
}
</td>
</tr>
}
</tbody>
</table>
CSS
.fail {
background-color:red;
}
.pass {
background-color:green;
}
.deletelink {
// style to look like a hyperlink if required
}