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

时间:2010-03-30 10:07:58

标签: asp.net-mvc jquery

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

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

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

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

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

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

更新:

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

3 个答案:

答案 0 :(得分:1)

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

<%@ Control Language="C#"Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Article>>"%>

<%foreach (var article in Model){%>
    <option><%:article.Title %></option>
<%} %>

我想我会选择第二个

答案 1 :(得分:1)

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

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

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

这是一个快速摘录

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

      return Json(vals);
} 

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

答案 2 :(得分:0)

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

使用局部视图非常适合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<Item> Items = GetItems();

    // 3. return enumerable list in JSON format:
    return new JsonResult{ Data = new {Items = Items, Result = "OK" }};
}

在客户端:

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