9

ASP.net (および一般的なプログラミング) は初めてで、Web API の構築に問題があります。具体的には、次の 2 つの分野でサポートが必要です。

  1. DOCcontroller新しいドキュメント (DOC テーブル) を投稿するように my を構成する方法。
  2. 実際の ajax 投稿の作成方法 --EXT_GUIDパラメータの受け渡しに問題があります。現状では、投稿しようとするとエラーが発生します。「複数のパラメーター (doc および parentOwner) をリクエストのコンテンツにバインドできません。」

基本的に、これは単純なドキュメント管理システム用です。ユーザーが外部データベース (EXT_GUID フィールド) からフィルター/パラメーターとして GUID を提供することで、ドキュメントの取得/投稿 (DOC) が必要です。各ドキュメントは複数の EXT_GUID を持つことができ、各 EXT_GUID は複数のドキュメント (DOC) を持つことができます。EXT_GUID フィールドは、http ポストの前に入力されていると想定できます。

これは DOCcontroller コードです

//POST api/DOC
public HttpResponseMessage PostDOC(DOC doc, List<string> parentOwners)
{
    if (ModelState.IsValid)
    {            
        var parents = db.BIMs.Where(bx => parentOwners.Contains(bx.EXT_GUID));

        foreach (var p in parents)
        doc.Owners.Add(p);

        db.DOCs.Add(doc);
        db.SaveChanges();

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, doc);
        response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = doc.Id }));
        return response;
    }
    else
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }
}

これは私のモデル設定です - EntityFramework codefirst のもの

public class EXT
{
    public int Id { get; set; }
    public string EXT_GUID { get; set; }
    public int ProjectID { get; set; }
    public virtual ICollection<DOC> DOCs { get; set; }
}

public class DOC
{
    public int Id { get; set; }
    public int ProjectID { get; set; }
    public string Subject { get; set; }
    public string Link { get; set; }
    public virtual ICollection<EXT> EXTs { get; set; }
}

これはより多くのストレージ モデルです...

public StoreDBContext() : base("name=StoreDBContext")
{
}
public DbSet<EXT> EXTs { get; set; }
public DbSet<DOC> DOCs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //Set FLUENT API config for many to many here
    modelBuilder.Entity<EXT>()
    .HasMany(a => a.DOCs)
    .WithMany()
    .Map(x =>
    {
        x.MapLeftKey("EXT_Id");
        x.MapRightKey("DOC_Id");
        x.ToTable("EXTsDOCs");
    });
}

AJAX コード

function AddDOC() {
    var parentOwner = "{\"" + $('#txtaddEXT').val() + "\"}";
    jQuery.support.cors = true;
    var DOC = {
        ProjectId: ProjectID,
        Subject: $('#txtaddDOCSubject').val(),
        Link: $('#txtaddDOCLink').val(),
            parentOwner: parentOwner
    };

    $.ajax({
        url: "http://localhost:54171/api/DOC/",
        type: 'POST',
        data: JSON.stringify(DOC),
        contentType: "application/json;charset=utf-8",
        success: function (data) {
            WriteResponse(data);
        },
        error: function (x, y, z) {
            alert(x + '\n' + y + '\n' + z);
        }
    });
}
4

1 に答える 1

0

クライアントから受け取るものと、データベースに保存するものは 2 つの異なるものです。あなたのドキュメントオブジェクトは大丈夫です:

var DOC = {
    ProjectId: ProjectID,
    Subject: $('#txtaddDOCSubject').val(),
    Link: $('#txtaddDOCLink').val(),
    parentOwner: parentOwner
};

ここで、サーバー ロジックを変更する必要があります。次のようなモデルを作成します。

public class DocReceivedModel 
{
    public int ProjectID { get; set; }
    public string Subject { get; set; }
    public string Link { get; set; }
    public List<string> parentOwner { get; set; }
}

次に、PostDOC メソッドは次のようになります。

            public HttpResponseMessage PostDOC(DocReceivedModel docReceived)
            {
                if (ModelState.IsValid)
                {
                    Doc newDoc = new Doc();
                    newDoc.ProjectID = docReceived.ProjectID
                    newDoc.Subject = docReceived.Subject
                    newDoc.Link = docReceived.Link

                    var parents = db.BIMs.Where(bx => docReceived.parentOwners.Contains(bx.EXT_GUID));
                    foreach (var p in parents)
                        newDoc.Owners.Add(p);
                            // I not see in your model Owners, maybe this is EXTs but I suppose you catch the idea

                    db.DOCs.Add(newDoc);
                    db.SaveChanges();

                    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, newDoc);
                    response.Headers.Location = new Uri(Url.Link("DefaultApi", new {id = newDoc.Id}));
                    return response;
                }
                else
                {
                    return Request.CreateResponse(HttpStatusCode.BadRequest);
                }
            }
于 2013-09-14T07:39:59.360 に答える