0

ユーザーが入力した条件に基づいてインポート レコードを表示する Web サービスを呼び出すアプリがあります。

各「インポート」には、0 から多数の PurchaseOrder、0 から多数のコンテナ、0 から多数の製品、0 から多数の請求書を含めることができます。

ビュー(問い合わせを表示する)は正常に動作しますが、送信ボタンをクリックすると、コントローラーがビューモデルを介して「インポート」情報を取得しません。「formCollection」を介してこれらのコントロールにアクセスできます。

何が欠けていますか????

これが私のコードです...

モデル...

namespace LemansCorpIntranet.Models
{    
    public class ImportWebViewModel
    {
        public string button { get; set; }
        public string status_filter { get; set; }
        public string import_id_filter { get; set; }
        public DateTime date_filter { get; set; }
        public string vendor_filter { get; set; }
        public string port_filter { get; set; }
        public string whse_filter { get; set; }
        public Boolean not_released_filter { get; set; }
        public int release_gap { get; set; }
        public List<import_row> import_rows;   /// this is the piece that is not coming
                                               // thru on the POST
    }

    public class import_row
    {
        public string update_switch { get; set; }
        public string id { get; set; }
        public IEnumerable<SelectListItem> ship_via { get; set; }
        public string broker_number { get; set; }
        public string voyage { get; set; }
        public string vessel { get; set; }
        public decimal shipment_value { get; set; }
        public int cartons { get; set; }
        public decimal weight { get; set; }
        public decimal volume { get; set; }
        public string clearance_port { get; set; }
        public string warehouses_in_shipment { get; set; }
        public string payment_type { get; set; }
        public string insurance { get; set; }
        public DateTime ship_date { get; set; }
        public DateTime close_date { get; set; }
        public DateTime customs_date { get; set; }
        public string customs_entry { get; set; }
        public DateTime pl_2_whse_date { get; set; }
        public DateTime estimated_arrival_date { get; set; }
        public DateTime wire_transfer_request_done_date { get; set; }
        public DateTime approved_broker_bill_date { get; set; }
        public DateTime product_released_date { get; set; }
        public List<Invoice> Invoices;
        public List<PurchaseOrder> PurchasOrders;
        public List<Product> Products;
        public List<Container> Containers;
    }

    public class Invoice
    {
        public string invoice_number { get; set; }
    }

    public class PurchaseOrder
    {
        public string id { get; set; }
        public string whse { get; set; }
        public string vendor_code { get; set; }
        public string vendor_name { get; set; }
    }

    public class Product
    {
        public int line_number { get; set; }
        public string description { get; set; }
    }

    public class Container
    {
        public int line_number { get; set; }
        public int size { get; set; }
        public string id { get; set; }
        public string seal { get; set; }
        public DateTime received_date { get; set; }
        public int cartons { get; set; }
    }  
}

これが私の見解です(部分的)

<% using (Html.BeginForm("ImportLog", "ImportWeb")) %>
    <%  { %>
            <table style="position:fixed">
.
.
.
<% if (Model.import_rows != null) %>
<% { %>
<%   var row_number = 0; %>
     <table id="import_web_detail">
<%   foreach (var row in Model.import_rows) %>
<%   { %>
<%     if (row.id != "          ")%>
<%     { %>
<%       row_number++; %>
         <tr style="vertical-align:top">
           <td style="width:.5em" />
           <td align="center">
             <table>
               <tr>
                 <td colspan="4"></td>
                 <td><%=Html.CheckBox("update_switch", row.update_switch)%></td>
                 <td colspan="4"></td>
               </tr>
             </table>
           </td>
           <td />
           <td>
             <table>
               <tr>
                 <td><%=Html.TextBox("import_id", row.id)%></td>
               </tr>
             </table>
           </td>

これが私のコントローラーです...

namespace LemansCorpIntranet.Controllers
{
    public class ImportWebController : Controller
    {
        eptest_importweb_svc.Service importweb_svc = new eptest_importweb_svc.Service();

        //
        // Import Web Request

        public ActionResult ImportLog(ImportWebViewModel import_request)
        {// import_request.import_rows is null. should be loaded with view detail
            switch (import_request.button)
            {
                case "Next":
                case "Previous":
                    return RedirectToAction("ImportPage", import_request);
                case "Update":
                    return RedirectToAction("ImportUpdate");
                case "Importlog":
                    return RedirectToAction("ImportReport");
                default:
                    break;
            }
            // ----------------------------------
            // fall thru for initial page display
            // ----------------------------------


            //     load "date filter" with default. 300 days in the past.
            //     ------------------------------------------------------
            import_request.date_filter = new DateTime(DateTime.Now.Year - 1,  
                                  DateTime.Now.Month, DateTime.Now.Day).AddDays(65);

            return View("ImportLog", import_request);
        }

ビュー/コントローラーの充実を投稿していません....

ビューをレンダリングするために機能します....

ビュー/フォームを送信すると、コントローラーはビューモデルの主要部分のアイテムにのみアクセスできます(「リスト」には何もありません)。

「formcollection」を介してこれらの他のコントロールにアクセスできます。

ビューモデルに null があるのはなぜだろうと思っています。

4

3 に答える 3

1

問題は、フィールドがネストされたクラスの一部であることを MVC モデル バインダーが理解できるようにフィールドに名前を付けていないことです。行ごとに、同じ名前のフィールドがあるだけです。それはうまくいきません。

これは、ヘルパー クラスの非タイプ セーフ バージョンを使用すべきでない理由の 1 つです。タイプ セーフ バージョンは正しい名前を自動的に生成するからです。EditorTemplates はコレクションに対して適切な処理を行い、コレクションを自動的に反復処理するため、これも利用する必要があります。

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.htmlを読む

あなたがやっているようにそれをしなければならない場合は、名前に配列構文を含める必要があります。foreach ではなく for ステートメントを使用し、カウンターを使用して行番号をカウントします。次のようにします。

<% for(int row = 0; row < Model.import_rows.Count; row++) { %>
    ....

    <td><%=Html.CheckBoxFor(x => Model.import_rows[row].update_switch)%></td>

    ....
<% } %>

詳細はこちら: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

于 2012-09-24T19:43:38.170 に答える
0

@HiddenFor欠落しているのは、モデルで取得できない値のいくつかの句だと思います。私があなたを正しく理解していれば、あなたはそれらのいくつかを手に入れていますが、すべてではありません。だから、あなたが得ていないものは@HiddenFor、それらのために定義し、何が起こるかを見てください。

アップデート

これは、スタックオーバーフローがネストされたビューモデルについて言うことです:

asp.netMVCのネストされたViewModelクラス

アップデート2

ここを見てください、あなたの問題に非常に似ているようです:

ASP.netMVC2。ポピュレートされたモデルがコントローラーに戻らない

お役に立てれば

于 2012-09-21T22:57:27.020 に答える
0

RedirectToAction でビューモデルを渡そうとしました..

これがそのように機能しないことを発見しました。

ご協力いただきありがとうございます。

于 2012-09-25T21:43:35.537 に答える