0

私が取り組んでいるプロジェクトでは、ユーザーが複数の項目を選択できるように、フォームにチェックボックスをオンにする必要があります。これらをboolとして個々の列に配置することもできますが、チェックボックスの値が変更されるか、追加する必要がある場合があります。そこで、これらのチェックボックスの名前を保持するテーブルを作成し、それらをリストしました。私の質問は; これらの値を顧客と一致する別のテーブルに取得するにはどうすればよいですか。これはどのように適切に処理する必要がありますか?

ビューには会社名とレコードIDがあります/AuditSchedule/details/208列に複数の値を入れるのは良い習慣ではないことを読みましたが、他にどのような選択肢がありますか?

どうもありがとう!

顧客のテーブルにあるのは、ProductTypeのフィールドです。これは何にもリンクされていません。チェックボックスとしてリストしたい製品タイプの別の表があります。私はこれら2つのテーブルの間に何の関係もありません。私にはあるべきではないように思えますが、私を訂正して、あるはずであるかどうか私に知らせてください。したがって、チェックボックスが選択されている場合、その値(ProductName)を顧客テーブルのProductTypeフィールドのコンマで区切って配置する必要があります。

顧客またはスケジュールの表は次のとおりです。

    public class AuditSchedule
{
    public virtual int AuditScheduleID { get; set; }
    public virtual Nullable<DateTime> audit_completed_date { get; set; }
    public virtual string gl_cmp_key { get; set; }
    public virtual string audit_year { get; set; }
    public virtual string ar_ship_key { get; set; }
    public virtual string ar_ship_name { get; set; }
    public virtual string im_adres_city { get; set; }
    public virtual string im_adres_state { get; set; }
    public virtual string audit_type { get; set; }
    public virtual string audit_no { get; set; }
    public virtual string audit_group { get; set; }
    public virtual string Footage { get; set; }
    public virtual string Rolling3MosFootage { get; set; }
    public virtual string snp_SalesRep8 { get; set; }
    public virtual string epg_sales_rep_accountable { get; set; }
    public virtual string tech_service_rep { get; set; }
    public virtual string audit_done_by { get; set; }
    public virtual Nullable<DateTime> audit_recieved_date { get; set; }
    public virtual string audit_notes { get; set; }
    public virtual string audit_pdf { get; set; }
    public virtual string updated { get; set; }
    public virtual string hidden { get; set; }
    public virtual string en_stats_key { get; set; }
    public virtual string Control_ID { get; set; }
    public virtual Nullable<DateTime> audit_date { get; set; }
    public virtual string contacts_present { get; set; }
    public virtual string audit_furnished_to { get; set; }
    public virtual string spacer_type { get; set; }
}

製品表は次のとおりです。

    public class SpacerProduct
{
    public int SpacerProductID { get; set; }
    public string SpacerBrand { get; set; }
    public string SpacerName { get; set; }
}

お役に立てれば

ビューは、AuditSchedulesのフォームタイプの編集であり、入力される場所はわずかです。その部分は機能します。ビューにチェックボックスを追加すると、迷子になります。チェックボックスのToListを設定する部分ビューを作成し、それをフォームに追加しました。表の結果を取得する方法がわかりません。

Tohidへの質問:いくつか質問があります。まず、ViewModelは、Modelsディレクトリ用の名前空間であり、私のモデルはモデルであると想定しています。_db.getAuditScheduleByIdは、別の方法を実行する必要がある可能性があると説明したエンティティに含まれていません。私の場合は_db.AuditSchedulesになりますが、ドロップダウンに表示されますが、気に入らないため、更新するように変更しました。2012年7月2日viewModel.AuditScheduleInstance = _db.AuditSchedules.Single(r => r.AuditScheduleID == id) ;

私はまだ問題を抱えています

_db.GetAvailableSpacerProducts()

私はそれを反映するものを私のエンティティに持っていません、そして私はそれを変更する方法がわかりません。おそらく私が他のもので変更したもののようなものですが、確かではありません。

2012年7月5日更新

QQAEntitiesは次のとおりです。

名前空間QQAForm.Models

{
public class QQAEntities : DbContext
   {
    public DbSet<AuditSchedule> AuditSchedules { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<SubCategory> SubCategories { get; set; }
    public DbSet<MainQuestion> MainQuestions { get; set; }
    public DbSet<Suggestion> Suggestions { get; set; }        
    public DbSet<DocumentLink> DocumentLinks { get; set; }
    public DbSet<Audit> Audits { get; set; }
    public DbSet<AuditData> AuditDatas { get; set; }
    public DbSet<SpacerProduct> SpacerProducts { get; set; }
    public DbSet<ScoreCard> ScoreCards { get; set; }



   }
}

また、私のソリューションにはQQAForm.Dataという別のプロジェクトがあります。これは、メンバーシップに関連するすべての役割とセキュリティのみを制御します。お役に立てれば。あなたの時間と忍耐に感謝します。

2012年7月6日更新

最終作業編集:

    [HttpPost]
    public ActionResult Edit(AuditScheduleEdit viewModel)
    {            
        if (ModelState.IsValid)
        {
            viewModel.PopulateCheckBoxsToSpacerType();
            _db.Entry(viewModel.AuditScheduleInstance).State = System.Data.EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
        else
        {
            return View(viewModel);
        }

    }

2012年8月2日更新

私はこれをこのプロジェクトの他の分野で使用できると判断しました。チェックボックスを使用する場所が複数あります。

これを別のビューに実装しようとしましたが、機能しません。これが機能しない理由は、チェックボックスにデータを入力するために、現在のテーブルのIDを調べて、それを更新できるようにするためです。これはスニペットです:

        //get
    public ActionResult _Forms(int id)
    {
        AuditFormEdit viewModel = new AuditFormEdit();
        viewModel.ScoreInstance = _db.MainAnswers.Single(r => r.MainAnswerID == id);
        viewModel.InitializeScoreCheckBoxHelperList(_db.Scores.ToList());
        return View(viewModel);
    }

    //post
    [HttpPost]
    public ActionResult _Forms(int id, AuditFormEdit viewModel)
    {
        if (ModelState.IsValid)
        {
            viewModel.PopulateCheckBoxsToScores();
            _db.Entry(viewModel.ScoreInstance).State = System.Data.EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("/");
        }
        else
        {
            return View(viewModel);
        }
    }

(r => r.MainAnswerID == id)が問題です。MainAnswerは、更新が必要なテーブルです。レコードには、AuditScheduleID、MainQuestionID、およびスコアのチェックボックスから入力されたテキストも挿入する必要があります。これをコメントアウトすると、何も表示されません。私が本当に必要としているのは、これを取得してデータを含む新しいレコードを挿入する方法です。これを行うためにコードを変更する方法がわかりません。

4

2 に答える 2

1

私があなたを正しく理解しているなら、あなたは言っています:

  1. クラスCustomerには、 ProductType名のコンマ区切りの文字列を保持するProductTypeというstringプロパティがあります。
  2. クラスProductTypeには、stringプロパティProductNameがあります。
  3. ビューでは、ProductTypeのいずれかがチェックボックスとして表示され、顧客ごとに選択/選択解除できます。

正しい?私には多対多の関係のように見えます。

MVCチュートリアルのこの章を読んだことがありますか:MVCを使用したEF入門?特にこの部分:ASP.NETMVCアプリケーション用のより複雑なデータモデルの作成

タイプをCustomer.ProductTypeからstringに変更List<ProductType>すると、すべてが解決します。

ただし、そのままにしておくCustomer.ProductTypeことstringで解決できます。

コード

AuditScheduleとクラス(モデル)によるとSpacerProduct、私は新しいVeiwModelクラスを開発しました。ViewModelは、他のクラスをパックし、それらをViewに送信できるようにするコンテナーと考え​​てください。

namespace MvcApplication1.ViewModels
{
    public class AuditScheduleEdit
    {
        public Models.AuditSchedule AuditScheduleInstance { get; set; }

        public List<SpacerProductCheckBoxHelper> SpacerProductCheckBoxHelperList { get; set; }

        public void InitializeSpacerProductCheckBoxHelperList(List<Models.SpacerProduct> SpacerProductList)
        {
            if (this.SpacerProductCheckBoxHelperList == null)
                this.SpacerProductCheckBoxHelperList = new List<SpacerProductCheckBoxHelper>();

            if (SpacerProductList != null
                && this.AuditScheduleInstance != null)
            {
                this.SpacerProductCheckBoxHelperList.Clear();
                SpacerProductCheckBoxHelper spacerProductCheckBoxHelper;
                string spacerTypes =
                    string.IsNullOrEmpty(this.AuditScheduleInstance.spacer_type) ?
                    string.Empty : this.AuditScheduleInstance.spacer_type;
                foreach (Models.SpacerProduct spacerProduct in SpacerProductList)
                {
                    spacerProductCheckBoxHelper = new SpacerProductCheckBoxHelper(spacerProduct);
                    if (spacerTypes.Contains(spacerProduct.SpacerName))
                        spacerProductCheckBoxHelper.Checked = true;
                    this.SpacerProductCheckBoxHelperList.Add(spacerProductCheckBoxHelper);
                }
            }
        }

        public void PopulateCheckBoxsToSpacerType()
        {
            this.AuditScheduleInstance.spacer_type = string.Empty;
            var spacerTypes = this.SpacerProductCheckBoxHelperList.Where(x => x.Checked)
                                  .Select<SpacerProductCheckBoxHelper, string>(x => x.SpacerName)
                                  .AsEnumerable();
            this.AuditScheduleInstance.spacer_type = string.Join(", ", spacerTypes);
        }

        public class SpacerProductCheckBoxHelper : Models.SpacerProduct
        {
            public bool Checked { get; set; }

            public SpacerProductCheckBoxHelper() : base() { }

            public SpacerProductCheckBoxHelper(Models.SpacerProduct spacerProduct)
            {
                this.SpacerProductID = spacerProduct.SpacerProductID;
                this.SpacerName = spacerProduct.SpacerName;
                this.SpacerBrand = spacerProduct.SpacerBrand;
            }
        }
    }
}

したがって、関連するコントローラーのEditメソッドは次のとおりです。

    public ActionResult Edit(int id)
    {
        AuditScheduleEdit viewModel = new AuditScheduleEdit();
        viewModel.AuditScheduleInstance = _db.GetAuditScheduleById(id);
        viewModel.InitializeSpacerProductCheckBoxHelperList(_db.GetAvailableSpacerProducts());
        return View(viewModel);
    }

    [HttpPost]
    public ActionResult Edit(AuditScheduleEdit viewModel)
    {
        if(ModelState.IsValid)
        {
            viewModel.PopulateCheckBoxsToSpacerType();
            // TODO: Add update logic here
            return RedirectToAction("Index");
        }
        else
        {
            return View(viewModel);
        }
    }

最初のアクション(HttpGET)では、のインスタンスを作成し、データベースからAuditScheduleEdit要求されたものを割り当てます( )(リポジトリからデータをクエリする方法が異なる場合があります)。AuditSchedule_db.GetAuditScheduleById(id)

次に、のコレクションSpacerProductsを関数に渡す必要がありInitializeSpacerProductCheckBoxHelperList()ます(長い名前なので、わかりやすく、わかりやすくしようとしています)。この関数はSpacerProductCheckBoxHelper、ビューにチェックボックスを生成するために使用されるリストを作成します。

ユーザーがフォームを送信するAuditScheduleEditと、(フォームデータに基づいて)再作成され、2番目の編集アクション(HttpPost)に送信されます。そこで、PopulateCheckBoxsToSpacerType()選択されたチェックボックスのリストをコンマ区切りの文字列に変換し、に割り当てますAuditSchedule.spacer_type

そしてここにビューがあります:

@model MvcApplication1.ViewModels.AuditScheduleEdit
@using (Html.BeginForm())
{
    <div>
        <h3>Audi Schedule</h3>
        @Html.LabelFor(m => m.AuditScheduleInstance.AuditScheduleID)
        @Html.DisplayFor(m => m.AuditScheduleInstance.AuditScheduleID)
        @Html.HiddenFor(m => m.AuditScheduleInstance.AuditScheduleID)
        <br />
        @Html.LabelFor(m => m.AuditScheduleInstance.Control_ID)
        @Html.EditorFor(m => m.AuditScheduleInstance.Control_ID)
        // Here, add any field of AuditSchedule which needs to show on edit form 
        //       like what I did for AuditScheduleID and Control_ID.
        <h3>SpacerType</h3>
        @for (int index = 0; index < Model.SpacerProductCheckBoxHelperList.Count; index++)
        {
            @Html.CheckBoxFor(m => m.SpacerProductCheckBoxHelperList[index].Checked)
            @Html.LabelFor(m => m.SpacerProductCheckBoxHelperList[index], Model.SpacerProductCheckBoxHelperList[index].SpacerName)
            @Html.HiddenFor(m => m.SpacerProductCheckBoxHelperList[index].SpacerProductID)
            @Html.HiddenFor(m => m.SpacerProductCheckBoxHelperList[index].SpacerName)
            <br />
        }
    </div>
    <div>
        <input type="submit" value="Save" />
    </div>
}

このコードはVisualStudio開発者2010Expで作成しましたが、うまく機能します。このコードはここからダウンロードできます

于 2012-06-30T13:26:20.923 に答える
0

あなたが尋ねた問題については明確ではありませんが、チェックボックスの値が作成したテーブルに保存されている場合、テーブル(ビュー)のレコードを更新する必要があると思います。テーブルを更新する必要はないと思います。 2 つのテーブル間の関係を作成するだけで、内部クエリと結合を使用してすべての日付を取得できます。

ただし、テーブルを更新する必要がある場合は、作成したテーブルで「挿入後」トリガーを使用できます。テーブル構造も共有していただけると大変助かります。

列 (AuditScheduleID int、SpacerType int) を持つもう 1 つのテーブル (itemselected とそれを選択している顧客の関係を格納するため) を作成する必要があります。このテーブルには、列と 1) 列の両方に複合キーが必要です。 Customer テーブルとのキー関係 2) 列 SpacerType は、Product テーブルとの外部キー関係を持つ必要があります。3) 顧客が複数の製品を選択して送信すると、各製品の情報と AuditScheduleID が、上で作成したテーブルの異なる行として保存されます。

これで、完全な正規化を使用してこの方法でデータを保存できます

于 2012-06-30T04:17:27.283 に答える