【问题标题】:Microsoft JScript runtime error: 'data.EmployeeDetails.EmployeeId' is null or not an object`Microsoft JScript 运行时错误:“data.EmployeeDetails.EmployeeId”为空或不是对象`
【发布时间】:2013-08-02 03:58:26
【问题描述】:

嗨,我一直在获取需要在 kendo UI GRID 中显示的数据,最初我也能够看到按钮、文本框和网格,但是当我在文本框中输入值然后按下按钮时,我需要显示在 kendo UI GRID 中输入的值 ...

当我在谷歌浏览器中运行这个应用程序时,它给出了空网格,在输入值然后按下提交按钮之后,但是当我在 IE8 中运行这个应用程序时,它在开始阶段本身就给出了这样的错误......

Unhandled exception at line 238, column 37 in Function code 0x800a138f - Microsoft JScript runtime error: 'data.EmployeeDetails.EmployeeId' is null or not an object

这是我的模型

    public class TextBoxGrid
    {
        public string EnteredValue { get; set; }
        public List<EmployeeDetails> employees;
    }  
    public class ParentViewModel
    {
        public EmployeeDetails EmployeeDetails { get; set; }
        public TextBoxGrid TextBoxGrid { get; set; }
    }
    public class EmployeeDetails
    {
        public string EmployeeId { get; set; }
        public string ManagerId { get; set; }
    }

这是我的控制器

public class EnterValuesGridController : Controller
{
    private static List<EmployeeDetails> empdtls;
    public ActionResult Index( ParentViewModel model)
    {
        var viewmodel = new ParentViewModel
        {
            TextBoxGrid = new TextBoxGrid { employees = GetEmployee().ToList() }
        };
        return View(viewmodel);
    }      
    [HttpPost]
    public ActionResult PostValues(TextBoxGrid model)
    {
        TempData["enteringValue"] = model.EnteredValue;
        var viewmodel = new ParentViewModel
        {
            TextBoxGrid = new TextBoxGrid { employees = GetEmployee().ToList() }
        };
        //ParentViewModel p = new ParentViewModel();
        //TextBoxGrid t = new TextBoxGrid();
        //t.EnteredValue = "a";
        //TempData["a1"] = t.EnteredValue;
        //t.employees = GetEmployee().ToList();
        //p.TextBoxGrid = t;
        //return View("Index", p);   
        return View("Index", viewmodel);        
    }
    public  IEnumerable<EmployeeDetails> GetEmployee()
    {
        string enteredValueId =(string) TempData["enteringValue"];
        string managerId = "M" +enteredValueId;
        empdtls = new List<EmployeeDetails>();
        EmployeeDetails em1 = new EmployeeDetails();
        em1.EmployeeId = enteredValueId;
        em1.ManagerId = managerId;
        empdtls.Add(em1);
        return empdtls.AsEnumerable();
    }
    public ActionResult Orders_Read([DataSourceRequest]DataSourceRequest request)
    {
        return Json(GetOrders().ToDataSourceResult(request));
    }
    private IEnumerable<EmployeeDetails> GetOrders()
    {
        return GetEmployee().AsEnumerable();
    }
}

这是我的观点

@model KendoPratapSampleMVCApp.Models.ParentViewModel
@{
    ViewBag.Title = "Index";
}    
@using (Html.BeginForm("PostValues", "EnterValuesGrid", FormMethod.Post))
{ 
     @Html.TextBoxFor(m=>m.TextBoxGrid.EnteredValue)    
     <input type="submit" name="Submitbutton1" value="Submit1" />               
     @(Html.Kendo().Grid<KendoPratapSampleMVCApp.Models.ParentViewModel>()    
    .Name("grid")
    .Columns(columns => {
        columns.Bound(s=>s.EmployeeDetails.EmployeeId).Filterable(false).Width(100);
        columns.Bound(s => s.EmployeeDetails.ManagerId).Filterable(false).Width(100);        
    })
    .Filterable()
    .HtmlAttributes(new { style = "height:430px;" })
    .DataSource(dataSource => dataSource       
        .Ajax()
        .PageSize(20)
        .Read(read => read.Action("Orders_Read", "EnterValuesGrid"))
     )
  )        
} 

我不知道我在哪里做错了,请你提出任何关于这个的想法.. 非常感谢....,我需要在 UI GRID 中做任何更改吗?我尝试过更改 post values 方法...但它对我不起作用...

更新: 更改 tempData 以查看 Bag...

    [HttpPost]
    public ActionResult PostValues(ParentViewModel model)
    {
        ViewBag.item = model.TextBoxGrid.EnteredValue;

        var viewmodel = new ParentViewModel
        {
            TextBoxGrid = new TextBoxGrid { employees = GetEmployee().ToList() }

        };

        //ParentViewModel p = new ParentViewModel();
        //TextBoxGrid t = new TextBoxGrid();
        //t.EnteredValue = "a";
        //TempData["a1"] = t.EnteredValue;
        //t.employees = GetEmployee().ToList();
        //p.TextBoxGrid = t;
        //return View("Index", p);   
        return View("Index", viewmodel);        
    }

    public  IEnumerable<EmployeeDetails> GetEmployee()
    {
        string enteredValueId = (string)ViewBag.item;
        string managerId = "M" +enteredValueId;
        empdtls = new List<EmployeeDetails>();
        EmployeeDetails em1 = new EmployeeDetails();
        em1.EmployeeId = enteredValueId;
        em1.ManagerId = managerId;
        empdtls.Add(em1);
        return empdtls;
    }

【问题讨论】:

  • TempData["enteringValue"] 是否存储在会话中?
  • 当我输入值时它没有存储..是否需要进行任何更改..
  • 那么 TempData["enteringValue"] 将为空。您需要以某种方式将输入的值发送回控制器并将其存储在会话中。
  • 有什么方法可以在不使用 tempdata 的情况下存储该值...
  • 能否尝试在模板中设置ViewBag中的值,看看是否能获取到controller.cs中的数据

标签: c# asp.net-mvc asp.net-mvc-4 kendo-ui kendo-grid


【解决方案1】:

嗨,pratap,我刚刚更新了你的代码,

型号

 public class TextBoxGrid
    {
        public string EnteredValue { get; set; }
        public List<EmployeeDetails> employees;
    }
    public class ParentViewModel
    {
        public EmployeeDetails EmployeeDetails { get; set; }
        public TextBoxGrid TextBoxGrid { get; set; }
    }
    public class EmployeeDetails
    {
        public string EnteredValue { get; set; }
        public string EmployeeId { get; set; }
        public string ManagerId { get; set; }
    }

查看

@model TwoModelInSinglePageModel.EmployeeDetails
@{
    ViewBag.Title = "Index";
}
<script src="~/Script/Jquery-1.8.1.min.js" type="text/javascript"></script>
<script src="~/Script/jquery-ui-1.8.20.min.js" type="text/javascript"></script>
<script src="@Url.Content("~/Script/kendo.all.min.js")" type="text/javascript"></script>
<script src="~/Script/kendo.web.min.js" type="text/javascript"></script>
<script src="~/Script/kendo.aspnetmvc.min.js" type="text/javascript"></script>

@using (Html.BeginForm("PostValues", "Test", FormMethod.Post))
{ 
    @Html.TextBoxFor(m => m.EnteredValue)    
    <input type="submit" name="Submitbutton1" value="Submit1" />               
    @(Html.Kendo().Grid<TwoModelInSinglePageModel.EmployeeDetails>()
    .Name("grid")
    .Columns(columns =>
    {
        columns.Bound(s => s.EmployeeId);
        columns.Bound(s => s.ManagerId);
    })
    .Filterable()
    .HtmlAttributes(new { style = "height:430px;" })
    .DataSource(dataSource => dataSource
        .Ajax()
        .PageSize(20)
           .Read(read => read.Action("Orders_Read", "Test"))
     )
  )        
}

控制器

private static List<EmployeeDetails> empdtls;
    public ActionResult PostValues()
    {
        return View();
    }

[HttpPost]
public ActionResult PostValues(EmployeeDetails model)
{
    ViewBag.item = model.EnteredValue;

    ParentViewModel viewmodels = new ParentViewModel
    {
        TextBoxGrid = new TextBoxGrid { employees = GetEmployee().ToList() }

    };

    ParentViewModel viewmodel = new ParentViewModel();
    EmployeeDetails em1 = new EmployeeDetails();
    for (int i = 0; i < viewmodels.TextBoxGrid.employees.Count(); i++)
    {

        em1.EmployeeId = viewmodels.TextBoxGrid.employees[i].EmployeeId;
        em1.ManagerId = viewmodels.TextBoxGrid.employees[i].ManagerId;
        viewmodel.EmployeeDetails = em1;
    }
    Session["EM1"] = em1;
    return View("PostValues", em1);
}

public List<EmployeeDetails> GetEmployee()
{
    string enteredValueId = (string)ViewBag.item;
    string managerId = "M" + enteredValueId;
    empdtls = new List<EmployeeDetails>();
    EmployeeDetails em1 = new EmployeeDetails();
    em1.EmployeeId = enteredValueId;
    em1.ManagerId = managerId;
    if (Session["EM1"] != null)
    {
        em1 = Session["EM1"] as EmployeeDetails;

        empdtls.Add(em1);
        Session["EM1"] = null;
    }
    else
    {
        empdtls.Add(em1);
    }
    return empdtls;
}

public ActionResult Orders_Read([DataSourceRequest]DataSourceRequest request, EmployeeDetails model)
{
    return Json(GetEmployee().ToDataSourceResult(request));
}

【讨论】:

  • 这个方法需要写什么吗public ActionResult PostValues() { return View(); }
  • 不,你不public ActionResult PostValues() { return View(); }它只是返回你的视图页面。
  • 但是当我运行应用程序时出现服务器未找到错误
  • 嗨,您的GETPOST 方法名称相同吗?如果相同,则将此 [HttpPost] 放入您的 post 方法中。
  • 嗨你想把这个[HttpPost]放在getemployee方法上
【解决方案2】:

好的,我再次阅读了您的帖子,您想在实际单击按钮时提交表单。那么,让我们尝试将值放入会话中

Session["enteringValue"] = model.EnteredValue;

您可以使用

检索它
string enteredValueId = (string)(Session["enteringValue"]);

【讨论】:

  • 我正在使用 viewbag 它工作正常,这意味着我正在将数据放入 viewbag 但我无法将数据绑定到 GRID .. 请再看看这个
  • 如果使用Ajax绑定剑道网格会非常简单。
  • 嗯,我也试过你的,我在会话中获得了价值,但我无法绑定网格..
  • 问题是即使你可以获取数据,数据也不会在页面上神奇地刷新。这就是我们从 razor 转向纯 js 解决方案的原因......
  • 好的,我有自定义列表,提交时需要将输入的值添加到网格中,我如何使用 ajax 实现这一点,请您提出任何想法(如果您以前做过)非常感谢我..
猜你喜欢
  • 2013-01-11
  • 2011-02-24
  • 2010-09-14
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多