初学者MVC问题 - 正确的方法来呈现列表和细节?

时间:2010-05-27 11:30:28

标签: c# asp.net-mvc

我正在尝试设置一个页面,其中显示项目列表和所选项目的详细信息。我有它工作,但想知道我是否遵循了正确的方法。我会以客户为例

我已将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对我来说是新手,我会对其他人是否对这是一个好方法感兴趣?

2 个答案:

答案 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