在尝试查找模型时,处理返回无法获得结果的最佳方法是什么?

时间:2016-10-01 19:30:02

标签: asp.net-mvc razor nullpointerexception asp.net-core-mvc

我正在尝试使用在线资源教自己MVC 6,但他们并不总是涵盖我想要学习的内容。如果我对那些应该相当明显的东西一无所知,我会道歉。

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

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

使用空模型返回视图是处理foreach搜索的“无匹配id”结果的最佳方法吗?

视图然后调用模型:

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

虽然它确实有效,但我想知道这是否是处理这个问题的正确方法。 感觉有点......哈哈。创建一个空模型只是为了返回一个不会导致空指针异常的对象?

虽然它不应该是必要的信息 - _cList被声明为private readonly List<Customer> _cList = new List<Customer>()作为内联伪数据库 - 对于那些通过谷歌发现这个并且很好奇的人。它使foreach工作,从而简化了搜索。在实际的SQL Query搜索中并不理想。标量函数可能是您必须使用的函数。

1 个答案:

答案 0 :(得分: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);
}

查看

@model SomeViewModel

@if (Model.Error == null)
{
    <P> @Model.Error</P>
}
else
{
    <P> @Model.Name </P>
    <P> @Model.Email </P>
}

在您的页面上没有太大的变化,您可以验证是否有错误。当然,在这种情况下,您应该将Customer留空。

此解决方案将为您提供更大的灵活性,您可以根据需要添加任意数量的属性来描述页面需求。

注意:代码尚未经过测试。