Json mvc3实体框架-将逗号分隔的字符串列表转换为viewmodel中的列表,允许用户从列表中删除项
我正在努力想办法用MVC做到这一点 我有一个实体框架对象,它有一个逗号分隔的db列表,不能改变事实,它是db中一个可怕的csl。我可以很容易地显示列表,让他们手动编辑。这很容易出错,希望将它们拆分并在视图中显示它们的列表。然后允许用户单击一个链接/按钮,将它们从字符串和数据库中删除,并刷新页面以反映这一点 我的第一个想法是使用JQuery做一个ajax json post,对点击@Html.ActionLink的每个项目进行删除。我可以让它执行异步post返回,它将删除该项,并将返回一个表示新字符串列表的字符串,我可以使用该字符串更新UL。他们第二次点击链接时,会给我一个404,我使用的脚本是: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返回,它将删除该项,并将返回一个表示新字
<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 = '"' + @Html.ActionLink("Remove", "RemoveItemFromList", "Deployment", null, new { @class = "viewSeasonsLink" }) + '"'; */
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);