2009-11-14 73 views
5

我试图使用JQuery的$ .getJSON从控制器访问模型数据,并在JavaScript中构建一个JSON对象以供用户添加和删除项目一个列表。所有JS都在一个外部文件中完成。模型数据的命中仅在页面第一次加载后完成,因此我可以获得用户可供选择的完整选项列表。之后,用户可以根据需要修改列表(并相应更新JSON对象),然后将其保存(写回到数据库)。从外部Javascript文件访问ASP.NET MVC模型数据

但是,这里是我的问题:当使用$ .getJSON时,我需要在Controller中调用的方法需要一个ID,以便它可以查找我正在讨论的特定资源并获取相关选项的列表到那个特定的资源。但是从外部的JS文件中,我不知道如何让该ID传递给Controller。它内置于首先打开页面的链接中,并位于URL中,但一旦加载页面,我不知道如何获取此ID以便将其传递给Controller。我贴我的一些下面的代码,因为我知道这是令人困惑:

控制器中的详细方法,最初加载页面(需要RESOURCEID知道加载):

public ActionResult Details(string resId) 
{ 
    //call base method 
    base.Details(resId, resourceType); 
    Evaluation eval = (Evaluation)this.Model; 
    ViewData.Model = eval; 
    return View("Index"); 
} 

在我外部JS文件,我这样做:

$.getJSON("/Evaluation/PopulateJournalOptions/" + id, populateJSON); 

和Controller,我写了被调用,以构建JSON对象的另一种方法叫做PopulateJournalOptions:

public JsonResult PopulateJournalOptions(string resId) 
{ 
    JournalOptionsResult jsonResult = new JournalOptionsResult(); 

    base.Details(resId, resourceType); 
    Evaluation eval = (Evaluation)this.Model; 

    jsonResult.Activities = eval.Journal.Activities; 
    jsonResult.Issues = eval.Journal.Issues; 
    jsonResult.ScheduledActions = eval.Journal.ScheduledActions; 

    return Json(jsonResult); 
} 

同样,我的问题是,一旦页面加载,我无法访问我需要传递给PopulateJournalOptions的ID。我试过没有给PopulateJournalOptions传递任何东西,然后在那里创建一个新对象,并将其设置为(Evaluation)this.Model,但this.Model似乎为null,可能是因为它是从JS调用的Controller的新实例。所以我有点卡在这里。有任何想法吗?

+0

我下面回答你的问题,我建议你获得良好的MVC书(来自Apress)并阅读关于请求生命周期的内容。 – 2009-11-14 21:36:33

回答

5

你有没有想过把ID为隐藏字段在页面上,然后有:

ViewData["resouceID"] = resouceID; 

在负荷最初的视图将这个你的JavaScript从字段中读取ID?

$.getJSON("/Evaluation/PopulateJournalOptions/" + $('#Id').attr('value'), populateJSON); 

然后,在你看来,

<%= Html.Hidden("Id") %> 

随着具有所需Id为属性模型

+0

我没有想到,这当然是一个有趣的方法。尽管这很简单,但我觉得这有点欺骗。这对其他人来说似乎是这样吗? – 2009-11-16 01:22:13

+0

我对这种方法的想法越多,听起来就越干净,所以我继续实施它。但不是.attr('value'),我需要使用.html()。否则,效果很好。感谢您的回应! 作为一个方面说明,我真的不喜欢我为了构建这个JSON对象(一次加载页面而另一次调用控制器操作返回JSON数据)打两次服务器。如果我可以在加载页面时将该JSON转换为外部JavaScript变量,而不必再次返回到服务器,那将会非常棒。 – 2009-11-16 01:36:43

+0

没有理由不能将值放入模型中,然后将其写入视图中的JavaScript变量。使用AJAX回调会加快初始页面加载速度,但是如果您可以承担时间,则可以直接将其放入视图中。 – tvanfosson 2009-11-16 02:32:29

0

控制器将这个:

<script> 
$(document).ready(function() { 
    $.getJSON("<%=Url.Action("YourActionName", "YourControllerName", new {id = ViewData["resouceID"]}) %>", populateJSON); 
}); 
</script> 
+0

嗨乔希,感谢您的快速回复。你能简要解释一下这是做什么的吗?看起来我可能还需要提供ID为“yourID”。我已经使用提供给$ .getJSON的硬编码ID测试了我的代码,并且一切正常,所以我的Controller调用,回调,路由等工作正常,但我不知道如何让ID传递给它。我可能会误解你的答案,但看起来我仍然需要提供ID。此外,这将从外部的JS文件工作?再次感谢。 – 2009-11-14 21:51:07

+0

我编辑了我的答案以进一步解释。 – 2009-11-14 22:25:15

+0

如果您最终需要从客户端的页面地址获取标识,请查看查询插件:http://plugins.jquery.com/project/query-object – 2009-11-14 22:27:40