asp.net mvc:从控制器返回刷新选择列表的正确方法是什么?

我是ASP.NET MVC的新手,尤其是ajax操作。 我有一个带有jquery对话框的表单,用于将项添加到下拉列表中。 这会发布到控制器操作。

如果从Controller Action返回任何内容(即void方法),页面返回已更新数据库,但显然没有表单的chnage。 使用添加的id /值更新下拉列表并选择项目的最佳做法是什么。 我认为我的选择是:

1)手动构造并返回构成新标签的html [这很容易并且有效,但似乎我错过了一些东西]

2)使用某种“助手”来构造新的html [这似乎有道理]

3)只返回id /值并将其添加到列表中并选择项目[考虑到项目需要按正确顺序排列等,这似乎有点过分]

4)使用某种部分视图[这是否意味着在ascx控件中创建其他表单? 不确定这会如何影响提交主表格? 另外,除非通过传递参数(不确定如何完成)可以重复使用,否则2可能是选项?]

更新:

看了一下,似乎用控制器生成html并不是一个好主意。 我已经看到其他post将部分视图呈现给字符串,我想这就是我需要的并分离关注点(因为html位在ascx中)。 关于这是否是良好做法的任何评论。

只要您乐意在jQuery中遍历列表并更新下拉列表,返回包含所有项目的JsonResult是最通用且带宽最少的解决方案。

使用局部视图对于HTML来说是很好的,你可以直接将.load(…)添加到你的选择中,但不那么通用。

我会选择JsonResult

在您的控制器中:

 public JsonResult UpdateItem(string sItem) { // 1. Insert new item into database if not exist... // {update code here} // 2. retrieve items from database: IEnumerable Items = GetItems(); // 3. return enumerable list in JSON format: return new JsonResult{ Data = new {Items = Items, Result = "OK" }}; } 

在客户端:

遍历Items数组并将项添加到列表中。

看一下ContentResult,你可以指定你返回的mime类型(text / html)你也可以创建一个控件来获取你在selectlist中放入的IEnumerable,并使用视图引擎构建它。 这样你就可以将html的格式(在这种情况下是一个选项列表)保存到视图中,而不是在代码中。

 <%@ Control Language="C#"Inherits="System.Web.Mvc.ViewUserControl>"%> <%foreach (var article in Model){%>  <%} %> 

我想我会选择第二个

根据我的理解,jQuery对话框包含一个表单,该表单在提交时将发布到使用某些信息更新数据库的操作。 您希望获取新添加的数据库信息并更新用于触发数据库更新的相同表单。

如果是这种情况,那么我认为最好的清洁和逻辑选项是在更新数据库后立即返回要放入下拉列表的项目的JSON序列化。 然后,使用jQuery,您将清除下拉列表并将option标记附加到其中。

您还可以编写一个新的单独操作,该操作返回所需数据库对象的JSON序列化。 你可以让jQuery调用另一个post到这个动作作为你的第一个ajaxpost(用于更新数据库的那个)的回调。

这是一个快速片段

 public ActionResult UpdateDatabase(string something) { /// update the database IEnumerable items = getItemsFromDatabase(); // or w/e var vals = items.Select(x=> new { value = x.ID, text = x.Name }); // something similar return Json(vals); } 

就个人而言,我会编写一个返回JSON的单独函数。 这确保了关注点的分离,并为我提供了一个我可以在许多不同的地方使用的function。