当值为空或0时,MVC和Razor显示整数

时间:2015-07-15 18:47:13

标签: model-view-controller

我在视图中有以下代码。

index.js

如果comments_id不为0或为空,则以下代码有效。

<span>@Html.DisplayFor(modelItem => item.comments.comments_id)</span>
<span>@item.comments.comments_id</span>

如果它为0或空,我得到 <span>@((item.comments.comments_id == 0) ? 0 : @item.comments.comments_id)</span>

该类包含此

System.NullReferenceException: Object reference not set to an instance of an object

如何克服这个问题?提前致谢。

----编辑更多代码---

public Nullable<int> comments_id { get; set; }

查看

 public ActionResult Show()
    { 
        var showItems = db.Projects.Include(p => p.Comments).ToList(); // INCLUDES ITEMS FROM BOTH TABLES
        return View(showItems);
    } 

有人发布了类似的内容,但我不明白答案。 http://forums.asp.net/t/1732717.aspx?How+to+check+if+model+property+is+empty+in+View+page

1 个答案:

答案 0 :(得分:0)

您需要使用HasValue来检查可空变量是否具有值。

<span>@((item.comments.comments_id.HasValue) ? @item.comments.comments_id : 0)</span>

编辑:添加了示例

您的视图代码看起来应该可以正常工作。下面是我为测试你的观点而编写的代码。控制器操作中的lambda表达式将被执行,直到它被使用。因此,在呈现视图之前,它不可能被执行。这可能会导致问题,因为那时数据库连接可能会关闭。但是,对ToList()的调用应该执行lambda表达式。所以问题可能是item.Comments为null。你应该测试一下,看看它是否和我的例子一样。

<强>控制器

public class HomeController : Controller
{
    public class Project
    {
        public string ProjectName { get; set; }
        public ProjectComments Comments { get; set; }
    }
    public class ProjectComments
    {
        public string Comments { get; set; }
        public Nullable<int> comments_id { get; set; }
    }

    public ActionResult Index()
    {
        var showItems = new List<Project>();
        showItems.Add(new Project()
        {
            ProjectName = "Project 1",
            Comments = new ProjectComments() { Comments = "some comments", comments_id = 1 }
        });
        showItems.Add(new Project()
        {
            ProjectName = "Project 2",
            Comments = new ProjectComments() { Comments = "more comments", comments_id = null }
        });

        return View(showItems);
    }
}

查看

@model IList<MvcApplication2.Controllers.HomeController.Project>

<table border="1">
@foreach (var item in Model)
{
    <tr>

        <td>
            @Html.DisplayFor(modelItem => item.ProjectName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Comments.comments_id)
        </td>
        <td>
            <span>
                @((item.Comments != null && item.Comments.comments_id.HasValue) ? @item.Comments.comments_id : 0)
                <a href="#">Create</a>
            </span>
        </td>
    </tr>
}
</table>