在控制器

时间:2017-08-28 11:13:07

标签: c# razor

我正在尝试编写一个简单的Web应用程序,它根据从选择列表中选择的ID来显示某些细节。

我可以使用以下方法从数据库中获取数据:

类别:

namespace InterviewTest.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;
[Table("Widget")]

        public partial class Widget
        {
            public int WidgetID { get; set; }

            [Required]
            [StringLength(50)]
            public string WidgetName { get; set; }

            [Required]
            public string WidgetDescription { get; set; }

            public int WidgetColourID { get; set; }
        }

}

控制器:

using System.Linq;
using System.Web.Mvc;
using InterviewTest.Models;

namespace InterviewTest.Controllers
{
    public class HomeController : Controller
    {
        WidgetConn db = new WidgetConn();

        public virtual ActionResult Index(Widget widget)
        {


            var widgets =
                (from w in db.Widgets
                 where w.WidgetID == 1
                 select new
                    {
                     WidgetName = w.WidgetName,
                     WidgetDescription = w.WidgetDescription,
                     WidgetColourID = w.WidgetColourID
                    }).ToList();

            var data = widgets[0];

            return View(data);
        }
    }
}

'数据'中返回的数据返回为:

WidgetID 1 WidgetDescription测试 WidgetColourID 1

测试视图:

@model InterviewTest.Models.Widget
@{
    ViewBag.Title = "test";
}

<h2>test</h2>

<div>
    <h4>Widget</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.WidgetName)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.WidgetName)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.WidgetDescription)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.WidgetDescription)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.WidgetColourID)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.WidgetColourID)
        </dd>

    </dl>
</div>
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.WidgetID }) |
    @Html.ActionLink("Back to List", "Index")
</p>

当我尝试使用@ Html.DisplayNameFor(model =&gt; model.WidgetName)来显示返回的数据时,我收到错误:

htmlhelper不包含DisplayNameFor的定义,也没有扩展方法DisplayName用于接受类型&#39; HTMLHelper&#39;的第一个参数。可以找到。你错过了汇编或参考吗?

我读到我应该使用System.Web.Mvc.HtmlHelper;&#39;但是这似乎是命名空间,所以不能以这种方式使用。更改我的命名空间意味着我无法再访问此类。

我还读到System.Web.Mvc.Html应该包含&#39; HtmlHelper&#39;但使用这个并没有解决我的问题。

我的问题是:

1:我应该使用带有.cshtml文件的@ Html.DisplayNameFor(model =&gt; model.WidgetName)还是有其他方式来访问数据?

2:如果我尝试访问数据的方式是正确的,我如何/在何处添加命名空间,以便我可以访问HtmlHelper命名空间。

3:如果我试图访问数据的方式对于.cshtml文件不正确,那么有人能指出我可以阅读的一些文档吗?

感谢。

1 个答案:

答案 0 :(得分:0)

我认为这是因为您选择的数据是未知类型。而不是未知,指定其类型。所以请替换您的代码,如下所示。

 public virtual ActionResult Index(Widget widget)
        {
            IEnumerable<Widget> widgets =
                (from w in db.Widgets
                 where w.WidgetID == 1
                 select new Widget 
                    {
                     WidgetName = w.WidgetName,
                     WidgetDescription = w.WidgetDescription,
                     WidgetColourID = w.WidgetColourID
                    }).ToList();

            var data = (widgets!=null && widgets.length>0)? widgets[0]: null;

            return View(data);
        }