【问题标题】:ViewData item key 'SelectedAustraliaStateId' is of type 'System.String' but must be of type 'IEnumerable<SelectListItem>'ViewData 项目键“SelectedAustraliaStateId”的类型为“System.String”,但必须为“IEnumerable<SelectListItem>”类型
【发布时间】:2014-02-19 05:10:55
【问题描述】:

实施下拉字段后,我无法保存记录。有人可以更正我的代码吗?

创建.cshtml

    @model SomeIndianShit.Models.Accommodation

@{
    ViewBag.Title = "Advertise Accommodation";
}

<form name="datapluspics" method="post" enctype="multipart/form-data">
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Accommodation</legend>

<div class="editor-label">
            @Html.LabelFor(model => model.State)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.SelectedAustraliaStateId, Model.AustraliaStates)
        </div>
 <p>
            <input type="submit" value=" Save " />
        </p>
    </fieldset>

</form>

我的模特:

public class AustraliaStates
    {
        [Key]
        public string AustraliaStateId { get; set; }
        public string AustraliaStateName { get; set; }
    }

public class Accommodation
    {
        [Key]
        public string A_Unique_Id { get; set; }

        [Display(Name = "Ad Id")]
        public string Ad_Id { get; set; }

        [Display(Name = "Posted By")]
        public string User { get; set; }

        [Display(Name = "Street")]
        public string Street { get; set; }

        [Required]
        [Display(Name = "Suburb")]
        public string Suburb { get; set; }

        [Required]
        [Display(Name = "State")]
        public string State { get; set; }

        public byte[] Picture1 { get; set; }



        public string SelectedAustraliaStateId { get; set; }
        public IEnumerable<SelectListItem> AustraliaStates { get; set; }
    }

AccommodationController.cs

// GET: /Accommodation/Create
        [Authorize]
        public ActionResult Create()
        {
            var model = new Accommodation
            {
                AustraliaStates = db.AustraliaStates
                             .ToList()
                             .Select(x => new SelectListItem
                             {
                                 Text = x.AustraliaStateName,
                                 Value = x.AustraliaStateId
                             })
            };

            return View(model);
        }

/ POST:/住宿/创建

[Authorize]
[HttpPost]
public ActionResult Create(Accommodation accommodation, HttpPostedFileBase file1, HttpPostedFileBase file2, HttpPostedFileBase file3)
{
    if (ModelState.IsValid)
    {
            // save and redirect
            // ...blah blah...
           //blah blah...

        db.Accommodation.Add(accommodation);
        //Save in Database
        db.SaveChanges();
        return RedirectToAction("Index");
    }


    // repopulate SelectList properties [I THINK THIS IS WRONG]
    var model = new Accommodation
    {
        AustraliaStates = db.AustraliaStates
                     .ToList()
                     .Select(x => new SelectListItem
                     {
                         Text = x.AustraliaStateName,
                         Value = x.AustraliaStateId
                     })
    };

    return View(accommodation);
}

填写表格后,点击保存按钮时,显示如下错误信息

具有“SelectedAustraliaStateId”键的 ViewData 项属于“System.String”类型,但必须属于“IEnumerable”类型。

【问题讨论】:

    标签: asp.net-mvc drop-down-menu


    【解决方案1】:

    在您的 HttpPost 控制器操作中,您需要在您传递给视图的模型上重新填充正确的属性,即在您的模型上设置 AustraliaStates,就像您在 GET 操作中所做的那样:

    accommodation.AustraliaStates = db.AustraliaStates
        .ToList()
        .Select(x => new SelectListItem
        {
            Text = x.AustraliaStateName,
            Value = x.AustraliaStateId
        });
    return View(accommodation);
    

    【讨论】:

    • 使用了上面的代码,但是我的模型是无效的 if (ModelState.IsValid) -- 显示为假
    • 那是因为模型存在验证错误。确保模型上用[Required] 属性修饰的属性具有值。
    • 我已在表单的所有可用字段中输入了有效数据,但仍未提交表单。当我单击保存按钮时,它只会停留在同一页面上,并且如果(ModelState.IsValid)模型显示为无效,则模型将显示为 false
    • 如果我将下拉字段更改为文本字段并且表单提交成功。
    • @Reddy,您的表单中没有字段绑定到 StateSuburb 属性。您的下拉列表绑定到SelectedAustraliaStateId。因此,您不会为那些必需的属性获得任何价值。
    猜你喜欢
    • 1970-01-01
    • 2014-04-17
    • 2015-09-18
    • 2014-10-02
    • 2014-10-02
    • 2012-01-25
    • 1970-01-01
    • 2013-10-22
    • 2015-02-05
    相关资源
    最近更新 更多