我正在尝试设置一个页面,其中显示项目列表和所选项目的详细信息。我有它工作,但想知道我是否遵循了正确的方法。我会以客户为例
我已将aspx页面设置为从IEnumerable of Customers继承。这似乎是显示项目列表的标准方法。对于详细信息,我添加了一个继承自客户的Customer用户控件。
我认为到目前为止我已走上正轨,但我对于应该在哪里存储我想要显示其详细信息的客户的ID感到有些困惑。我想在控制器操作中使id成为可选的,以便可以使用“/ customers”或“customers / 1”命中页面,因此我将arg作为可选项并将id存储在ViewData中,如下所示:
public ActionResult Customers(string id = "0")
{
Models.DBContext db = new Models.DBContext();
var cList = db.Customers.OrderByDescending(c => c.CustomerNumber);
if (id == "0")
{
ViewData["CustomerNumber"] = cList.First().CustomerNumber.ToString();
}
else
{
ViewData["CustomerNumber"] = id;
}
return View("Customers", cList);
}
然后我在前端使用RenderPartial渲染了User控件:
<%var CustomerList = from x in Model
where x.CustomerNumber == Convert.ToInt32(ViewData["CustomerNumber"])
select x;
Customer c = (Customer)CustomerList.First(); %>
<% Html.RenderPartial("Customer",c); %>
然后我在每个列出的项目上都有一个actionLink: &lt;%:Html.ActionLink(“选择”,“客户”,新{id = item.CustomerNumber})%&gt;
这一切似乎都有效,但由于MVC对我来说是新手,我会对其他人是否对这是一个好方法感兴趣?
答案 0 :(得分:2)
关于正确的MVC和关注点的分离,您不应该在视图中调用LINQ查询。要解决这个问题,请将控制器操作代码从您拥有的内容更改为:
if (id == "0")
{
ViewData["CustomerDetails"] = cList.First();
}
else
{
ViewData["CustomerDetails"] = From x in db.customers where x.id = cInt(id);
}
然后你的部分
<% Html.RenderPartial("Customer",ViewData["CustomerDetails"]); %>
您是否在同一屏幕上显示客户信息,而不是单独的视图?
答案 1 :(得分:1)
在这种情况下,我会采取以下方法。 显示客户列表,无论是列表框还是下拉列表。 我们假设它是一个下拉列表,可能不是非常用户友好
您可以将文本作为客户名称,然后将值作为客户ID
<select title="Customers">
<option label="Pieter" value="001"></option>
</select>
并使用JQuery的$.getJSON,你可以通过调用asp.net MVC动作加载新数据。 请注意,您的操作应返回JsonResult