DropDown List错误:“没有类型'IEnumerable <selectlistitem>'</selectlistitem>的ViewData项

时间:2014-04-29 08:55:48

标签: c# asp.net-mvc asp.net-mvc-4 razor partial-views

尝试更改我的view to PartialView,我将其与标签系统一起使用,我收到此错误:There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'REGION_ID'._CreateCit.cshtml文件的第30行:

@model pfebs0.Models.CITOYEN

<h2>Demandeur Info</h2>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)



        // some code removed (HTML tag)

        <div class="form-group">
            <label for="REGION_ID" >Region</label>
            @Html.DropDownList("REGION_ID", String.Empty)
            @Html.ValidationMessageFor(model => model.REGION_ID)
        </div>

// some other input tag 
        <br />
            <button type="submit" class="btn btn-default">Valider</button>&nbsp; &nbsp;
            <button type="reset" class="btn btn-default">Annuler</button>&nbsp; &nbsp;
    </div>
}

这是我的index.cshtml档案:

    @{
    ViewBag.Title = "Creation D'un nouveau Demande";
}

<ul class="nav nav-tabs" id="myTab">
  <li class="active"><a href="#tab1">Add user tab</a></li>
  <li><a href="#tab2">add request tab</a></li>

</ul>
<div class="tab-content">
     <div id="tab1" class="tab-pane active">
        @Html.Partial("_CreateCit", ViewData)
     </div>

    <div id="tab2" class="tab-pane">
         @Html.Partial("_CreateDM")
    </div>
</div>



@section Scripts {
    // script Section removed
}

她是我的控制器代码:

public ActionResult CreateCit()
    {
        ViewData["REGION_ID"] = new SelectList(db.REGION, "REGION_ID", "NOM");
        return PartialView("_CreateCit");
    }

    //
    // POST: /Citoyen/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult CreateCit(CITOYEN citoyen)
    {
        if (ModelState.IsValid)
        {
            db.CITOYEN.Add(citoyen);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.REGION_ID = new SelectList(db.REGION, "REGION_ID", "NOM", citoyen.REGION_ID);
        return PartialView(citoyen);
    }

相同的代码使用标准视图,我刚刚将return View更改为return PartialView(Viewname)并编辑了cshtml文件。 我想我错过了什么!!

1 个答案:

答案 0 :(得分:2)

@Html.Partial只是呈现局部视图而不会调用控制器操作。它只需要部分视图代码,而无需到达控制器(在动作中设置断点并测试它)。 ViewData不会包含您认为会包含的数据。您需要使用@Html.Action

<div id="tab1" class="tab-pane active">
    @Html.Action("CreateCit")
 </div>

<div id="tab2" class="tab-pane"> 
     @Html.Action("CreateDM")
</div>

或者,在调用ViewData之前,尝试在@Html.Partial对象中明确添加数据:

<div id="tab1" class="tab-pane active">
    @{
          ViewData["REGION_ID_DDL"] = ViewData["REGION_ID"]
    }
    @Html.Partial("_CreateCit", ViewData)
 </div>

修改 要解决有关成功消息的注释:您可以执行几项操作来显示成功消息。我个人最喜欢的是创建一个ResultModel

public class ResultModel
{
     public string Message { get; set; }
     public ResultType TypeOfResult { get; set; }
}

public Enum TypeOfResult 
{
     Error,
     Success
}

创建一个接受ResultModel的部分视图并显示消息:

@model YourNamespace.Models.ResultModel

<p>Sort du resultat: @Model.TypeOfResult</p>
<p>Message: @Model.Message</p>

然后你就这样称呼它:

 if (ModelState.IsValid)
 {
     db.CITOYEN.Add(citoyen);
     db.SaveChanges();

     ResultModel resultModel = new ResultModel();
     resultModel.TypeOfResult = TypeOfResult.Success;
     //my french is a bit rusty but the result from Google Translate sounds good enough
     resultModel.Message = "Citoyen ajouté avec succès.";


     return PartialView("_ResultSummary", resultModel);
 }

当然,这也可用于追踪错误。您可以在try-catch调用周围添加db.SaveChanges();,并在try块中设置成功类型/消息,在catch块中设置错误类型/消息。

此方法的另一个优点是ResultModel对象也可以作为JSON字符串发送,以防您想要显示JavaScript&#34; alert&#34;甚至是自定义弹出窗口。