C# MVC3 模型无效



我目前在模型中收到错误,说它无法从字符串转换为模型。一旦我尝试添加新的数据库表条目,就会发生这种情况。我正在使用SQL Server,对于前端,我使用的是c# mvc3剃须刀视图。

型:

    namespace NBProfiler.Model
{
    using System;
    using System.Collections.Generic;
    public partial class PersonContempancy
    {
        public int Id { get; set; }
        public int PersonId { get; set; }
        public Nullable<System.DateTime> AttainedDate { get; set; }
        public int FrameworkId { get; set; }
        public int ContempancyCategoryId { get; set; }
        public int ContempancyId { get; set; }
        public int ContempancyLevelId { get; set; }
        public int FrameworkLevelId { get; set; }
        public virtual Contempancy Contempancy { get; set; }
        public virtual ContempancyCategory ContempancyCategory { get; set; }
        public virtual FrameworkLevel FrameworkLevel { get; set; }
        public virtual Framework Framework { get; set; }
        public virtual Person Person { get; set; }
        public virtual ContempancyLevel ContempancyLevel { get; set; }
    }
}

控制器:

public ActionResult Create()
    {
       ViewBag.Contepancies = db.Contempancies.ToList();
       ViewBag.ContempancyCategory = db.ContempancyCategories.ToList();
       ViewBag.ContempancyLevel = db.ContempancyLevels.ToList();
       ViewBag.FrameworkLevel = db.FrameworkLevels.ToList() ;
       ViewBag.Person = db.People.ToList();
       ViewBag.Framework = db.Frameworks.ToList();
        return View();
    } 
    //
    // POST: /Mapping/Create
    [HttpPost]
    public ActionResult Create(PersonContempancy personcontempancy)
    {
        if (ModelState.IsValid)
        {
            db.PersonContempancies.Add(personcontempancy);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }

        ViewBag.Contepancies = db.Contempancies.ToList();
        ViewBag.ContempancyCategory = db.ContempancyCategories.ToList();
        ViewBag.ContempancyLevel = db.ContempancyLevels.ToList();
        ViewBag.FrameworkLevel = db.FrameworkLevels.ToList();
        ViewBag.Person = db.People.ToList();
        ViewBag.Framework = db.Frameworks.ToList();
        return View(personcontempancy);
    }

最后查看:(我已经从视图中删除了其他项目,因为它们都是相同的代码,所以为了缩短它,我删除了它)

    @model NBProfiler.Model.PersonContempancy

@{
    ViewBag.Title = "Create";
}
<h2>Map Skill to Person</h2>

<script src="../../Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
 <link href="../../Content/themes/start/jquery-ui-1.8.22.custom.css" rel="stylesheet"
        type="text/css" />
<script src="../../Scripts/jquery-ui-1.8.11.min.js" type="text/javascript"></script>   
@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>PersonContempancy</legend>
        <div class="editor-label">
           Name:
        </div>
        <div class="editor-field">
            Html.DropDownListFor(m => m.Person, new SelectList(ViewBag.Person as System.Collections.IEnumerable, "PersonId", "PersonName"), "Choose Name")
        </div>
        @*<div class="editor-field">*@
        <div class="editor-label">
                @*@Html.LabelFor(m => m.ContempancyCategory)*@
            </div>
        <div class="editor-field">
            @Html.DropDownListFor(m => m.ContempancyCategory, new   SelectList(ViewBag.ContempancyCategory as System.Collections.IEnumerable, "ContempancyCategoryId", "ContempancyCategoryName"),"Select", new {id = "category" })
        <p>
            <input name="submit" type="submit" value="Map Skill" />
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink("Show Table", "Index")
</div>
<script type="text/javascript">
      $(document).ready(function () {
      $("#category").change(function () {
      var idCat = $(this).val();
      $.getJSON("/Mapping/contempancies", { CategoryID: idCat },
      function (MyData) {
      var select = $("#contempancy");
      select.empty();
      $.each(MyData,function(index, itemData) {
      select.append($('<option/>', {
      value: itemData.Value,
      text: itemData.Text
      }));
      });
      });
      });
});
</script>

谢谢!

看起来问题是您将视图模型视为实体模型,这绝不是一个好主意。

将数据传入/传出视图时,应具有显式视图模型,并且仅传递视图所需的数据。此外,您将数据层与您的视图耦合,这违背了 MVC 的目的!

在您的示例中,如果PersonContempancy确实是一个视图模型(而不是实体),那么您应该使用它来创建一个新的实体来映射它所需的数据,AutoMapper 是一个非常漂亮的库。

public class PersonContempancyViewModel
{
    // update with properties the view needs
}
[HttpPost] 
public ActionResult Create(PersonContempancyViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    {
        var entity = new PersonContempancyEntity();
        // map properties from view model to entity
        // entity.FrameworkId = viewModel.FrameworkId etc..
        db.PersonContempancies.Add(entity);  
        db.SaveChanges(); 
        return RedirectToAction("Index");   
    }
    ...
}

最新更新