【问题标题】:Create drop down list in the create return dump在创建返回转储中创建下拉列表
【发布时间】:2014-04-03 15:58:02
【问题描述】:

我已经创建了 MVC5 应用程序,我希望在服务器属性的创建使用下拉列表中 当我运行它时,我得到了转储(错误是:“对象引用未设置为对象的实例。”)我应该怎么做?

我试试

    <div class="form-group">
        @Html.LabelFor(model => model.SystemType, new { @class = "control-label col-md-2" })
        <div class="col-md-10">

                @Html.DropDownListFor(model => model.SystemType, Model.SystemType)
            </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.User, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.User)
            @Html.ValidationMessageFor(model => model.User)
        </div>
    </div>

在模型类中我有以下代码

公共课 Amta {

    public string User { get; set; }

    public IEnumerable<SelectListItem> SystemType
    {
        get
        {
            return new[]
            {
                new SelectListItem {Value = "D", Text = "Dev"},
                new SelectListItem {Value = "p", Text = "Production"}
            };
        }
    }
}

【问题讨论】:

  • Model.Server 需要是一个 SelectList
  • 什么是“Model.Server”?
  • @COLDTOLD - 这是错误的,因为我更改了我所做的所有测试。我更新了帖子,但仍然无法正常工作
  • @RKS - 错了,我更新帖子还是不行

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 razor


【解决方案1】:

向 Amta 模型添加一个属性,以便在回发表单时收集选定的值。

@Html.DropDownList("SelectedSystemType", Model.SystemType)

@Html.DropDownListFor(model => model.SelectedSystemType, Model.SystemType)

public class Amta {

    public string User { get; set; }

    public string SelectedSystemType { get; set; }

    public IEnumerable<SelectListItem> SystemType
    {
        get
        {
            return new[]
            {
                new SelectListItem {Value = "D", Text = "Dev"},
                new SelectListItem {Value = "p", Text = "Production"}
            };
        }
    }
}

##这是我的测试方法##

控制器

public ActionResult Test()
{
    return View(new TestModel());
}

[HttpPost]
public ActionResult Test(TestModel model)
{
    return View(model);
}

查看

@model DemoKendoMvc.Models.TestModel
@{
    ViewBag.Title = "Test";
}

@using (Html.BeginForm("Test", "Home", FormMethod.Post))
{
    @Html.DropDownListFor(model => model.SelectedSystemType, Model.SystemType)
    @Html.EditorFor(model => model.User)
    @Html.ValidationMessageFor(model => model.User)
    <input type="submit" value="Submit" />
}

型号

public class TestModel
{
    public string User { get; set; }

    public string SelectedSystemType { get; set; }

    public IEnumerable<SelectListItem> SystemType
    {
        get
        {
            return new[]
            {
                new SelectListItem {Value = "D", Text = "Dev"},
                new SelectListItem {Value = "p", Text = "Production"}
            };
        }
    }
}

发布价值

## 更新了评论中询问的代码##

public ActionResult Create()
{
    return View(new TestModel());
}

[HttpPost]
public ActionResult Create(TestModel model)
{
    try
    {
        // TODO: Add insert logic here

        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

如果您在创建视图时使用Create Template,则SelectedSystemType 将被创建为EditorFor。因此,您需要将其更改为 DropDownListFor

@Html.DropDownListFor(model => model.SelectedSystemType, Model.SystemType)

【讨论】:

  • 谢谢蒂姆,我都试过了,但仍然得到相同的转储,我担心这是因为第二个参数 Model.SystemType,知道吗?
  • 即使我添加了@if (Model.SystemType != null) { @Html.DropDownList("SelectedSystemType", Model.SystemType) }
  • 我不明白,我创建新项目,创建类并在您编写时放置属性,然后通过脚手架创建新控制器并将下拉代码放在创建操作中并且它不起作用.当我将代码放在索引 cshtml 中时,下拉菜单正在工作,可能是什么问题?
  • 默认情况下,ASP.Net MVC 模板带有很多额外的东西。最坏的情况,您可以尝试使用 Empty MVC 模板。
  • 是的,但我需要该表,因为我有绑定到 sql 表的附加属性...也许在创建时我应该为下拉列表使用不同的代码?在您的程序中,您生成脚手架并将代码放入创建或索引中?在索引中它的工作,我能够看到下拉列表但在创建中我使用相同的代码并且我得到了转储...
【解决方案2】:

检查 DropDownListFor 的重载。我觉得你需要使用这个。

DropDownListFor overload

第一个表达式应该是一个 lambda 表达式,它指向一个字符串返回类型的属性。这将返回下拉列表的选定元素。

第二个表达式应该是您要与下拉列表绑定的列表。

检查这两件事,如果它仍然不适合你,请告诉我。

在这里,您在 lambda 表达式以及列表中使用 SystemType 属性。

【讨论】:

  • 谢谢,请提供示例如何将列表放在那里,因为这是模型上的...
  • 正如您在 SystemType 之上定义了一个属性 User,您需要再定义一个属性,该属性将在 POST 期间将 SelectedValue 带回。您需要在 lambda 表达式中绑定此属性
  • 用户正在工作,但这里我需要下拉列表,您可以发布您认为应该解决问题的代码吗?
  • 这正是 Win 在答案中发布的方式。
猜你喜欢
  • 2012-01-02
  • 2014-12-15
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多