使用Json创建操作Asp.Net MVC

时间:2015-06-13 09:59:12

标签: c# json asp.net-mvc

当我使用Json Create操作创建新记录时,我试图纠正重复记录问题。

我视图中的Json脚本

$.ajax({
    url:'/Panels/CreateNewAlert',
    dataType:'json';
    type:'post',
    contentType:'application/json;charset=utf-8'
    data:JSON.stringify({
        alertMap:{AlertModeID:$('#AlertModeID').val(),AlertPriorityID:$('#AlertPriorityID').val()},
        alertLog:{AlertTitle:$('#AlertLog_AlertTitle').val(),AlertText:$('#AlertLog_AlertText').val(),AlertStartDate:$('#AlertLog_AlertStartDate').val(),AlertActive:'true'},
        recipientlistip:brutelistip,
        recipientlistpc:brutelistpc
    }),
    async:true,
    processData:false,
    cache:false,
    succes:function(data){
        alert(data);
     },
    error:function(xhr){
        alert('error');
     }
})

控制器

[HttpPost]
public JsonResult CreateNewAlert(AlertMap alertMap, AlertLog alertLog, RecipientMap recipientMap, int[] recipientlistip, int[] recipientlistpc)
{
   if(ModelState.IsValid)
   {
   db.AlertLog.Add(alertLog);
   db.SaveChanges();

   int alertid = alertLog.AlertID;
   recipientMap.IPgroupID = 3;
   recipientMap.AlertID = alertid;
   db.RecipientMap.Add(recipientMap);
   db.SaveChanges();

   alertMap.AlertID=alertid;
   alertMap.UsersID= User.Identity.GetUserId();
   db.AlertMap.Add(alertMap);
   db.SaveChanges();
   }
   return Json("Succes!");
}

我不明白为什么alertLog被记录两次,有两个不同的id。记录alertMap和recipientMap没有重复。

我已经使用VS debug和db.SaveChanges()检查了alertLog,只执行了一次。我试过了一个测试:

alertLog.AlertActive = true;
alertLog.AlertTitle = "pif";
alertLog.AlertText = "pof";
alertLog.AlertStartDate = DateTime.Now;
alertLog.AlertEndDate = DateTime.Now;
db.AlertLog.Add(alertLog);
db.SaveChanges();

我已直接在控制器中添加数据......并且没有重复。也许是我的Json语法不正确......我还能做另一项测试吗? 感谢

编辑:我认为这是AlertID外键的一个问题。 AlertID在AlertLog表上,作为具有标识增量的主键。我在我的RecipientMap中引用了AlertID作为外键。当用户编写DeskAlert时,他会为此警报选择一个收件人列表(IP组或/和pc组)。所以RecipientMap表可以这样:

|ID(Pk)|IPgroupID(fk)|PCgroupID(fk)|AlertID(fk)|
|------|-------------|-------------|-----------|
| 1    |   1         |  null       |   15      |
| 2    |   1         |  null       |   15      |
| 3    |   2         |  1          |   16      |

我认为我的问题是AlertID外键配置不好

编辑2:好的,这是最后一步。

最后一件事,我不明白。它是关于如何在我的数据表中添加列表的。我试图使用列表,但是,我错过了一些东西。

var AL = new AlertLog()
{..};
var IPlist = new List<RecipientMap>();
var rp = new RecipientMap();
foreach (int ipid in recipientlistip)
{
    RM.IPgroupID = ipid;
}
IPlist.Add(rp);
AL.RecipientMap.AddRange(IPlist);

在最后一行,我在AddRange "System.Collections.Generic.ICollection<WebAppDev.RecipientMap> does not contain a definition for 'AddRange' and no extension method 'AddRange' accepting a first argument of type System.Collections.Generic.ICollection<WebAppDev.RecipientMap> could be found (are you missing a using directive or an assembly reference?)"

上收到此错误

在我的模型类文件中,IPgroupID和PCgroupID是:

public Nullable<int>IPgroupID {get;set;}
public Nullable<int>PCgroupID {get;set;}

和解决方案! 是的,它有效!在我的控制器中我已经做了这个(一个列表):

List<RecipientMap>IPlist= new List<RecipientMap>();
for (int i = 0;i<recipientlistip.Length;i++){
    IPlist.Add(new RecipientMap
    {
        IPgroupID = recipientlistip[i]
    });
}
AL.RecipientMap.AddRange(IPlist);

但我还添加了一个ExtensionMethods,用于将AddRange与ICollection一起使用。这就是为什么它在开始时没有起作用的原因。非常感谢你的帮助!

3 个答案:

答案 0 :(得分:0)

听起来你有一个主人(AlertLog)和两个细节(RecipientMap,AlertMap)。如果你在SQL Server中设置了关系,请检查一下:

  // create Master
  var AL = new AlertLog() 
{ AlertModeID = alertLog.AlertModeID, AlertPriorityID = alertLog.AlertPriorityID};

  // create Details
  var RM = new RecipientMap() { .. = ...}; // Do NOT consider FK here!
  var AM = new AlertMap() { .. = ... }; // Do NOT consider FK here!

  // add Details to Master
  AL.RecipentMaps.Add(RM); // FK is automatically set here
  AL.AlertMaps.Add(AM); // FK is automatically set here

  db.AlertLog.Add(AL); // add Master
  db.SaveChanges();

答案 1 :(得分:0)

首先,请确保您使用的是最新的EF 6.1.3,其次,您可能需要将此答案与之前的答案结合起来。

所以,有一个List<RecipientMap>如下:

int ipGroupID = // something you know how to find

var RM1 = new RecipientMap(){IPgroupID = ipGroupID, ..};
var RM2 = new RecipientMap(){IPgroupID = ipGroupID, ..};
var RM3 = new RecipientMap(){IPgroupID = ipGroupID, ..};

var listRM = new List<RecipientMap>(){RM1, RM2, RM3};

然后,您需要AL.RecipentMaps.Add(RM)而不是AL.RecipentMaps.AddRange(listRM),而是将更改保存到db。这样,系统会自动设置AlertLog的FK,并且IPgroupID之前已设置为RecipientMap列表。

答案 2 :(得分:-1)

在某些使用JQuery的情况下,程序员可能会意外地为Submit提供两个事件处理程序!检查这个问题,你是否在你的JQuery处理程序旁边有“onClick”?