Json mvc3实体框架-将逗号分隔的字符串列表转换为viewmodel中的列表,允许用户从列表中删除项

Json mvc3实体框架-将逗号分隔的字符串列表转换为viewmodel中的列表,允许用户从列表中删除项,json,asp.net-mvc-3,jquery,Json,Asp.net Mvc 3,Jquery,我正在努力想办法用MVC做到这一点 我有一个实体框架对象,它有一个逗号分隔的db列表,不能改变事实,它是db中一个可怕的csl。我可以很容易地显示列表,让他们手动编辑。这很容易出错,希望将它们拆分并在视图中显示它们的列表。然后允许用户单击一个链接/按钮,将它们从字符串和数据库中删除,并刷新页面以反映这一点 我的第一个想法是使用JQuery做一个ajax json post,对点击@Html.ActionLink的每个项目进行删除。我可以让它执行异步post返回,它将删除该项,并将返回一个表示新字

我正在努力想办法用MVC做到这一点

我有一个实体框架对象,它有一个逗号分隔的db列表,不能改变事实,它是db中一个可怕的csl。我可以很容易地显示列表,让他们手动编辑。这很容易出错,希望将它们拆分并在视图中显示它们的列表。然后允许用户单击一个链接/按钮,将它们从字符串和数据库中删除,并刷新页面以反映这一点

我的第一个想法是使用JQuery做一个ajax json post,对点击@Html.ActionLink的每个项目进行删除。我可以让它执行异步post返回,它将删除该项,并将返回一个表示新字符串列表的字符串,我可以使用该字符串更新UL。他们第二次点击链接时,会给我一个404,我使用的脚本是:

<script type="text/javascript">

    $(document).ready(function () {
    $('.viewSeasonsLink').click(function () {
            var data =
            {
                item: $(this).parents('li').first().find('.flagName').text(), 
                deploymentId: @Model.Id                 
            };
            $.post(this.href, data, function (result) {
                var list = $("#testme");
                list.empty();
                var items = result.split(",");
                $(items).each(function(index) {

//                  /* var link = '&quot;' +  @Html.ActionLink("Remove",     "RemoveItemFromList", "Deployment", null, new { @class = "viewSeasonsLink" }) + '&quot;';     */
                    var link = '<a class="viewSeasonsLink"     href="/SAMSite/Deployment/RemoveItemFromList">Remove</a>';

                list.append('<li><span class="flagName">' + items[index] + '</span> - ' + link + ' </li>');
                    /* list.append('<li><span class="flagName">' + items[index] + '</span> - ' + '\'' + @Html.ActionLink("Remove", "RemoveItemFromList", "Deployment", null,     new { @class = "viewSeasonsLink" }) + '\'</li>');                     */
                });                
            }, "json");
           return false;     
        });
    });
</script>
我无法让动作链接与jquery脚本一起工作,因此尝试对其进行编码,但仍然没有成功

然后我想我会尝试做一个简单的actionlink回到一个方法,删除它并返回正常视图,再次发布并更新数据库,但根本不会刷新网页

 <ul id="testme2">
            @foreach (string flag in ViewBag.FeatureFlags)
            {
                <li><span class="flagName">@flag</span> - @Html.ActionLink("Remove", "RemoveItemFromListTest", "Deployment", null, new { @class = "viewSeasonsLink" })</li>
            }
        </ul>

 public ActionResult RemoveItemFromListTest(string item, int deploymentId)
    {
        Deployment deployment = db.Deployments.Single(d => d.Id == deploymentId);
        ViewBag.CustomerId = new SelectList(db.Customers, "Id", "Name", deployment.CustomerId);

        List<string> featureFlags = deployment.FeatureFlags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
        featureFlags.Remove(item);

        deployment.FeatureFlags = ConvertBackToCommaList(featureFlags);
        ViewBag.FeatureFlags = featureFlags;
        //db.SaveChanges();

        return View("Edit", deployment);
    }
编辑

我曾经有点傻:

第二个测试是让它执行完整的回发和更新,但jquery仍然捕获到它,并且没有传递值。我将行更改为:

<li><span class="flagName">@flag</span> - @Html.ActionLink("Remove", "RemoveItemFromListTest", "Deployment", new { item = @flag, deploymentId = Model.Id }, null)</li>

这确实有效,但有点不方便,这意味着在单击“删除”链接之前对表单所做的任何更改都将丢失。

我想我看到了两个问题。一个是viewSeasonsList click事件上的初始.Post。您正在发回加载页面的操作,而不是将处理删除的操作。在我看来,根据你所描述的方法,他们不会采取相同的行动

var url = '/SAMSite/Deployment/RemoveItemFromList';
然后

其次,在Ajax响应中,当您重建列表时,您将为链接包含一个href属性。为什么?您不是在使用这些链接导航,而是在启动一个已经设置好的Ajax请求

var link = '<a class="viewSeasonsLink">Remove</a>';

最终,jquery解决方案有一个主要问题。当我添加一个新的LI元素时,它并没有连接到ajax调用,因为这只是发生在document.ready上。现在,我将simple.click替换为一个委托,该委托还将连接在ready事件之后添加的所有元素:


嗨,Steve,我已经加入了这个过程,它每次都会调用remove-from-list方法,如果这是您在第一点中提到的。重建链接的原因是我清空UL元素,然后重建它。我只是觉得这可能有点落后,我可以遍历并删除从服务器返回的列表中不再存在的任何元素是的,我的帖子是关于让它工作的。你说你会得到一个404后,1个项目被删除,我想我的建议将解决这个问题。至于你的评论,我认为重建这份名单没什么大不了的。你可以删除点击的元素,我想$this.remove;我会的。
var link = '<a class="viewSeasonsLink">Remove</a>';
$('#featureflaglist').delegate('.removeflaglink', 'click', RemoveFlagFromList);