【问题标题】:How to deal with null data in controller/view model如何处理控制器/视图模型中的空数据
【发布时间】:2012-02-15 03:56:33
【问题描述】:

当将数据从服务返回到控制器的操作中时,处理空数据的最佳方法是什么。在下面的示例中,我在服务中查询一个 Page。但是,如果该 Id 的页面不存在,我应该如何处理呢?

public ActionResult Edit(int id)
{
    var page = Services.PageService.GetPage(id);

    if(page == null)
    {
        // Do something about it so that the view model doesn't throw an
        //exception when it gets passed a null Page object
    }

    return View(page);
}

我是否应该创建一个更精细的 ViewModel,它有一个名为 Found 的布尔属性,所以我可以这样做:

public ActionResult Edit(int id)
{
    var page = Services.PageService.GetPage(id);
    var viewModel = new PageEditViewModel()
                        {
                            Found = (page != null),
                            Page = page
                        };

    return View(viewModel);
}

然后在视图模型中

@model Payntbrush.Presentation.Demo.MVC3.Areas.Admin.Models.PageIndexViewModel

@{
    ViewBag.Title = "Index";
}

<h2>Pages</h2>

<table>
<tr>
    <td><strong>Title</strong></td>

</tr>

@if (@Model.Found)
{
@foreach (var page in @Model.Pages)
 {
     <tr>
         <td>@page.Title</td>
         <td>@Html.ActionLink("Edit", "Edit", "Page", new {id = @page.Id})</td>
     </tr>
 }
}
else
{
    <strong>CANNOT FIND PAGE</strong>
}
</table>

其他人在这种情况下会怎么做?上述情况可以正常工作,但有没有更聪明或更受好评的方法来做到这一点?

干杯

【问题讨论】:

  • 在我看来,这完全取决于发生错误时您想要做什么。如果在这种情况下您想要显示“无法找到页面”,那么我认为您的方法没有任何问题。除此之外,我个人会传递 null,并在视图中检查 null。

标签: c# asp.net asp.net-mvc-3 viewmodel


【解决方案1】:

如果页面为空,则返回内容。喜欢:

public ActionResult Edit(int id)
{
    var page = Services.PageService.GetPage(id);

    if(page == null)
    {
        return Content("CANNOT FIND PAGE");
    }

    return View(page);
}

【讨论】:

    【解决方案2】:

    想到2种可能性:

    1. 显示 404 页面:

      public ActionResult Edit(int id)
      {
          var page = Services.PageService.GetPage(id);
      
          if(page == null)
          {
              return HttpNotFound();
          }
      
          return View(page);
      }
      
    2. 如果您想在同一视图上显示错误,您可以在视图模型中包含一个属性,指示未找到该项目,并在相应视图中针对该属性进行测试。

    因此,在这种情况下,基本上这将取决于您希望如何将错误呈现给用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多