2016-10-01 35 views
1

我想教自己使用在线来源的MVC 6,但他们并不总是完全覆盖我正在学习的东西。道歉,如果我似乎无知的东西应该是相当明显的。尝试查找模型时处理返回没有结果的最佳方法?

在这种情况下,我使用的将数据传递给视图:

public ActionResult Index(int? id) 
    { 
     foreach (Customer c in _cList) 
     { 
      if (c.Id == id) 
      { 
       return View(c); 
      } 
     } 
     return View(new Customer()); 
    } 

与空模型处理一个“无匹配的ID”一个foreach搜索的结果的最佳方式返回视图?

视图然后调用模型本身:

@if (Model.Id != 0) 
{ 
    <P> @Model.Name </P> 
    <P> @Model.Email </P> 
} 
else 
{ 
    <P> Nothing found!</P> 
} 

虽然它INFACT的工作,我想知道这是来处理这个正确的方式。它只是感觉有点...哈克。创建一个空模型只是为了返回一个不会导致空指针异常的对象?

虽然它不应该是必要的信息 - _cList被宣布为private readonly List<Customer> _cList = new List<Customer>()作为内联伪数据库 - 对于那些谁是通过谷歌和好奇的人谁发现这一点。它使foreach工作,因此简化了搜索。在实际的SQL查询搜索中不够理想。标量函数可能是您必须使用的。

回答

1

有一个更大的问题,你错过了。 MVC是Model,View(ViewModel)和Controller。

控制器在MVC应返回一个ViewModel描述模型,而不是它自己的模型。

更合适的实现将创建一个ViewModel,它将反映视图的模型。

视图模型

public class SomeViewModel 
{ 
    public Customer Customer { get; set; } 
    public string Error { get; set; } // Or a boolean HasErrors property. 
} 

控制器

public ActionResult Index(int? id) 
{ 
    var foundController = _cList.FirstOrDefault(c => c.Id == id); 
    var viewModel = new SomeViewModel 
    { 
     Customer = foundController 
    }; 
    if (foundController == null) 
    { 
     viewModel.Error = "No matches found!" 
    } 
    return View(viewModel); 
} 

查看

​​

在你的页面有我没有什么大的变化,你可以验证是否有错误。当然,在这种情况下,您应该将客户保留为空。

该解决方案将给您更多的灵活性,您可以根据需要添加尽可能多的属性来描述页面需求。

说明:代码尚未经过测试。

+1

感谢您提供这样一个深刻而又翔实的回答。从现在开始,我将使用ViewModel以更安全的方式访问模型。 至于处理这些错误,我制作了一个名为empty的道具,并将其设置为“bool”,并以与设置错误相同的方式进行设置。 你的Controller的第一行使我意识到我也应该学习LINQ。 哦,这么多事情,这么短的时间。 – Bitz

+1

我们生活的故事..你欢迎。 –

+0

你正在将MVC与MVVM混为一谈。虽然它们都非常密切,但MVC并不需要ViewModels。不包含ViewModels并不坏,也不一定总是包含它们。它是情景式的,在某些情况下,ViewModels只会导致代码臃肿。 –