0

上記の件名の使用に関して、2 つの問題があります。

1 つのビューで使用する必要がある 2 つの厳密に型指定されたモデルがあります。2 つの異なるモデルが必要な理由は、読み取られるデータが 2 つの異なるデータベースから取得されるためです。そのため、それぞれに edmx (Entity Framework) データ モデルが必要でした。

「テンプレート」と「保証人」の動的リストを取り込みたいだけです。戻ってくるアイテムの数は明らかに変わる可能性があります。

問題1:各チェックボックスを「チェック済み」に設定し、その名前を表示に設定したい。これにより、2 番目の構文で設計時のコンパイル エラーが発生していなくても、構文が正しいかどうか、または設定した方法と異なるかどうかはわかりません。

問題 2: もう 1 つの問題は、チェック ボックスのセットごとに異なるモデルを使用する必要があることです。しかし、チェック ボックスの 2 番目のセットにモデルを設定すると、最初のモデルは無視されます (これは最後のモデルであるため、これは理にかなっています)。

チェックボックスを正しく設定するために、同じビューで各モデルをうまく使用するにはどうすればよいですか?

コードは次のとおりです。

<tr>
                            <td colspan="5">
                                <b>@Html.Label("lbl_Templates", "Templates:")</b>
                            </td>
                        </tr>
                        <tr>
                            @model IEnumerable<PDFConverterModel.PDFTemplate>
                            @foreach (var item in Model)
                            {
                                <td>
                                    @Html.CheckBoxFor(model => true, item.TemplateName)
                                </td>
                            }
                        </tr>
                        <tr>
                            <td colspan="5">
                                <b>@Html.Label("lbl_Guarantor", "Guarantor(s):")</b>
                            </td>
                        </tr>
                        <tr>
                                @model IEnumerable<PDFConverterModel.tGuarantor>
                                @foreach (var item in Model)
                                {
                                    <td>
                                        @Html.CheckBoxFor(model => true, item.GuarantorFirstName + " " + item.GuarantorLastName)
                                    </td>
                                }
                        </tr>

ところで、最初のパラメーターがラベルの ID で、2 番目のパラメーターが表示される値である場合、ラベルの使用は構文的に正しく設定されていますか?

ソリューションの一部: 私はほとんどそこにいます... ビューの CheckBoxFor Html ヘルパーを介して表示したいプロパティのインデックス作成に問題があります (これは今まで使用したことがありません)。 ..

この最後の部分で私を助けていただければ、とても感謝しています...

以下の ViewModel を作成したことがわかります (私が使用しているのは ViewModelTemplate_Guarantors クラスです)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PDFConverterModel;

namespace PDFConverterModel.ViewModels
{
    public class ViewModelTemplate
    {
        public int SelectedTemplateId { get; set; }
        public IEnumerable<PDFTemplate> Templates { get; set; }
    }

    public class ViewModelGuarantors
    {
        public int SelectedGuarantorId { get; set; }
        public IEnumerable<tGuarantor> Guarantors { get; set; }
    }

    public class ViewModelDepartment
    {
        public int SelectedDepartmentId { get; set; }
        public IEnumerable<Department> Departments { get; set; }
    }

    public class ViewModelTemplate_Guarantors
    {
        public int SelectedTemplateId { get; set; }
        public IEnumerable<PDFTemplate> Templates { get; set; }

        public int SelectedGuarantorId { get; set; }
        public IEnumerable<tGuarantor> Guarantors { get; set; }
    }
}

以下は、モデルを設定するクライアント プロジェクト内の別の DLL で作成したビジネス コード メソッドです。

public ViewModelTemplate_Guarantors SelectViewModelTemplate_Guarantors(int LoanId, string LoanTypeId, int DepartmentId)
        {
            try
            {
                var model = new ViewModelTemplate_Guarantors();

                using (PDFService03Entities DbContext1 = new PDFService03Entities())
                {

                    DbContext1.Database.Connection.Open();

                    IEnumerable<PDFTemplate> temps = DbContext1.PDFTemplates.Where(p => p.LoanTypeId == Convert.ToInt32(LoanTypeId) && p.DepartmentId == DepartmentId).FromCache(CachePolicy.WithSlidingExpiration(TimeSpan.FromSeconds(30)));

                    model.Templates = temps.Select(x => new PDFTemplate
                    {
                        TemplateId = x.TemplateId.ToString(),
                        TemplateName = x.TemplateName
                    });
                }

                using (VisionEntities DbContext2 = new VisionEntities())
                {
                    DbContext2.Database.Connection.Open();

                    IEnumerable<tGuarantor> guars = DbContext2.tGuarantors.Where(p => p.ApplicationNum == LoanId).FromCache(CachePolicy.WithSlidingExpiration(TimeSpan.FromSeconds(30)));

                    model.Guarantors = guars.Select(x => new tGuarantor
                    {
                        ApplicationNum = x.ApplicationNum,
                        GuarantorFirstName = x.GuarantorFirstName,
                        GuarantorLastName = x.GuarantorLastName
                    });
                }

                return model;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

以下は、上記のコードを呼び出すコントローラー アクション メソッドの一部です。

ViewModelTemplate_Guarantors tg = db.SelectViewModelTemplate_Guarantors(Convert.ToInt32(loanID), loanType, Convert.ToInt32(selectedVal));

以下は、ビューで問題が発生している場所です...

私は IEnumerable オブジェクトを返しているので、ここで添付ファイルを送信できた場合、View の使用方法を示す 4 つのスクリーン ショットがあります。

スクリーンショットは、テンプレートと保証人が表示されていることを明確に示していると言えば十分です. どちらも IEnumerable ViewModelTemplate_Guarantors.Templates および .Guarantors 型です。

戻ってくるアイテムのインデックスを入れたいだけですが、次の設計時のコンパイル エラーが発生しています。

「タイプ 'System.Collections.Generic.IEnumerable」および tGuarantor の式に [ ] を使用したインデックス作成をそれぞれ適用できません。

私がこれに取り組むことに燃え尽きない限り、それを 101 プログラミングと呼んでください。

以下で何が間違っていますか???

これが私の見解です:

@model IEnumerable<PDFConverterModel.ViewModels.ViewModelTemplate_Guarantors>
@{
    ViewBag.Title = "BHG :: PDF Generator";
    int ctr = 0;
}
<h2>@ViewBag.Message</h2>

<form id="form1" runat="server">
    <div>
        <table>
            <tr>
                <td>
                    <table style="width: 1000px">
                        <tr>
                            <td colspan="5">
                                <img alt="BHG Logo" src="~/Images/logo.gif" />
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <label for="txtLoanID">Loan ID :</label>
                            @(Html.Kendo().IntegerTextBox()
                                        .Name("txtLoanID")
                                        .Placeholder("Enter LoanID")
                                )

                            <td colspan="3">
                                <input type="submit" id="btnRefresh" value='Refresh' />
                            </td>
                        </tr>
                        <tr>
                            <td><@Html.Label("lblLoanType1", "Loan Type : ")</td>
                            <td><@Html.Label("lblLoanType2", "SBA")</td>
                            <td></td>
                            <td>
                                <label for="ddlDept">Department:</label>
                                @(Html.Kendo().DropDownList()
                                      .Name("ddlDept")
                                      .DataTextField("DepartmentName")
                                      .DataValueField("DepartmentID")
                                      .Events(e => e.Change("Refresh"))
                                      .DataSource(source =>
                                      {
                                          source.Read(read =>
                                          {
                                              read.Action("GetDepartments", "Home");
                                          });
                                      })
                                )
                            </td>
                        </tr>
                        <tr>
                            <td colspan="5">
                                <b>@Html.Label("lbl_Templates", "Templates:")</b>
                            </td>
                        </tr>
                        <tr>
                            @ctr = 0;
                            @foreach (var item in Model)
                            {
                                <td>
                                    @Html.CheckBoxFor(model => item.Templates[ctr].TemplateName)
                                    @ctr = ctr + 1;
                                    @Html.LabelFor(model => item.Templates[ctr].TemplateName)
                                </td>
                            }
                        </tr>
                        <tr>
                            <td colspan="5">
                                <b>@Html.Label("lbl_Guarantor", "Guarantor(s):")</b>
                            </td>
                        </tr>
                        <tr>
                            @ctr = 0;
                            @foreach (var item in Model)
                            {
                                <td>
                                    @Html.CheckBoxFor(model => item.Guarantors[ctr].GuarantorFirstName + " " + item.GuarantorLastName)
                                    @ctr = ctr + 1;
                                    @Html.LabelFor(model => item.Guarantors[ctr].GuarantorFirstName + " " + item.GuarantorLastName)
                                </td>
                            }
                        </tr>
                        <tr>
                            <td colspan="2"></td>
                            <td>
                                @*@using (Html.BeginForm("GeneratePDF", "Home", new { @loanID = loanID }, FormMethod.Post))
                                { 
                                    <input type="submit" id="btnGeneratePDF" value='Generate PDF' />
                                }*@
                            </td>
                            <td colspan="2"></td>
                        </tr>
                        <tr>
                            <td colspan="5">
                                <b>@ViewBag.Error</b>
                            </td>
                        </tr>
                    </table>
                </td>
            </tr>
        </table>
    </div>
</form>

<script type="text/javascript">

    $(document).ready(function () {
        $("#ddlDept").prepend("<option value='All' selected='selected'></option>");
    });

    var txtLoanID;

    $("#btnRefresh").click(function () {
        Refresh();
    });

    function Refresh() {

        var txtLoanID = $("#txtLoanID").val();

        if (txtLoanID != "") {
            $.post('/Home/Refresh', { loanID: $('#txtLoanID').val(), loanType: $('#lblLoanType2').val, selectedVal: $("#ddlDept option:selected").text() }, function (data) {
                data.success;
                if (data.success == true) {
                    if (data.templist == true) {
                        //show the templates
                        $("#lbl_Templates").visible = true;
                        $("#btnGeneratePDF").visible = true;
                    }
                    if (data.guarlist == true) {
                        //show the guarantors
                        $("#lbl_Guarantor").visible = true;
                        $("#btnGeneratePDF").visible = true;
                    }
                    if ((data.templist == true) && (data.guarlist == true)) {
                        $("#btnGeneratePDF").visible = true;
                    }
                    else {
                        $("#btnGeneratePDF").visible = false;
                    }
                }
                else {
                    $("#btnGeneratePDF").visible = false;
                    //hide the templates
                    $("#lbl_Templates").visible = false;
                    $("#btnGeneratePDF").visible = false;
                    //hide the guarantors
                    $("#lbl_Guarantor").visible = false;
                    $("#btnGeneratePDF").visible = false;
                }
            });
        }
        else {
            alert("Please enter a Loan ID.");
        }
    }

    $("#form1").validate({
        event: "submit",
        rules: {
            txtLoanID: {
                required: true
            }
        },
        messages: {
            txtLoanID: {
                required: ' Please enter a Loan ID. '
            }
        }
    });

</script>
4

2 に答える 2

2

モデルに存在しない値のコントロールを作成するタスクを本当に実行する必要がある場合は、Html.CheckBoxFor の代わりに Html.Checkbox を使用できます。

これにより、名前、値、および IsChecked プロパティをプログラムで指定できます。

または、他の回答が示唆するようにして、モデルに GarantorFullName プロパティを作成します。

于 2012-09-30T17:48:44.650 に答える
1

CheckBoxFor は、モデル内の 1 つのプロパティの正確な名前を想定しています。

item.GuarantorFirstName + " " + item.GuarantorLastNameのチェックボックスは使用できません

たとえば、item.GuarantorFirstName のみなど、1 つのアイテムのみが可能です。

2 つが同時に必要な場合は、モデルで item.GuarantorFirstName + " " + item.GuarantorLastName を含むプロパティ フルネームを実行してください。

CheckBoxFor は item.Fullname を指す必要があります。

于 2012-09-30T14:38:20.410 に答える