2012-03-31 19 views
5

これはなぜ動作しないのですか? 1つのページに複数の送信ボタンについての記事をたくさん読んだことがありますが、背景に何が起こっているのか分かりません。私は他の人がその記事でやっていることに従うように努力しましたが、どれもうまくいかないようです。私はここで本当に何が起こっているのか理解しようとしています。私は、ページが投稿されたときに何が起こるかと何か関係があると考えています。.NET MVC 3の送信ボタンが異なる動作をする

両方のボタンは全く異なるものです。 最初のボタンがフォームをポストします。フォームのポストコードでは、Vehicle/Indexにリダイレクトされます。 第2ボタンはフォームを投稿せず、/車両/ CreateNewVehiclePartに直接進みます。

これは私が欲しいものです。私は両方のボタンがフォームを提出するようにしたい(私は検証を実行し、移動する前に車両への変更を保存することができます)。車両データが保存されたら、どのボタンがクリックされたかに基づいて/Vehicle/AddPartsToVehicleまたは/Vehicle/CreateNewVehiclePartに移動します。ここで

<table class="layouttable"> 
    <tr> 
     <td> 
      @using (Html.BeginForm("AddPartsToVehicle", "Vehicle", FormMethod.Post, null)) 
      { 
       <input type="submit" value="Add Parts To Vehicle" /> 
      } 
     </td> 
     <td> 
      @using (Html.BeginForm("CreateNewVehiclePart", "Vehicle", FormMethod.Post, null)) 
      { 
       <input type="submit" value="Create New Vehicle Part" /> 
      } 
     </td> 
    </tr> 
</table> 

車両モデルさ:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 
using System.Globalization; 


namespace ShopLog.Models 
{ 
    public class Vehicle 
    { 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid VehicleID { get; set; } 

    [Timestamp] 
    public Byte[] Timestamp { get; set; } 

    [Required] 
    [Display(Name = "Vehicle Name")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string VehicleName { get; set; } 

    [Display(Name = "Assigned To")] 
    [MaxLength(30, ErrorMessage= "The {0} must be no more than {2} characters long.")] 
    public string AssignedTo { get; set; } 

    [Display(Name = "ID Number")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string IDNumber { get; set; } 

    [Display(Name = "Active")] 
    public bool Active { get; set; } 

    [Display(Name = "Sign Out Vehicle")] 
    public bool SignOutVehicle { get; set; } 

    [Display(Name = "Have Title")] 
    public bool HaveTitle { get; set; } 

    [Display(Name = "Mileage or Hours")] 
    public int? MileageOrHours { get; set; } 

    [Display(Name = "Make")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string Make { get; set; } 

    [Display(Name = "Model")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string Model { get; set; } 

    [Display(Name = "Year")] 
    public int? Year { get; set; } 

    [Display(Name = "Engine")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string Engine { get; set; } 

    [Display(Name = "Transmission Gears")] 
    public int? TransmissionGears { get; set; } 

    [Display(Name = "VIN")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string VIN { get; set; } 

    [Display(Name = "Serial Number")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string SerialNumber { get; set; } 

    [Display(Name = "Color")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string Color { get; set; } 

    [Display(Name = "Air Filter")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string AirFilter { get; set; } 

    [Display(Name = "Engine Oil Filter")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string EngineOilFilter { get; set; } 

    [Display(Name = "Fuel Filter")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string FuelFilter { get; set; } 

    [Display(Name = "Transmission Oil Filter")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string TransmissionOilFilter { get; set; } 

    [Display(Name = "HydraulicOilFilter")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string HydraulicOilFilter { get; set; } 

    [Display(Name = "Interior A/C Filter")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string InteriorACFilter { get; set; } 

    [Display(Name = "Differential Oil")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string DifferentialOil { get; set; } 

    [Display(Name = "Transmission Oil")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string TransmissionOil { get; set; } 

    [Display(Name = "Engine Oil")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string EngineOil { get; set; } 

    [Display(Name = "Tire Size")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string TireSize { get; set; } 

    [Display(Name = "Tire Pressure")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string TirePressure { get; set; } 

    [Display(Name = "Smog Due Date")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")] 
    public DateTime? SmogDue { get; set; } 

    [Display(Name = "Registration Due Date")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")] 
    public DateTime? RegistrationDue { get; set; } 

    [Display(Name = "Insurance Due Date")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")] 
    public DateTime? InsuranceDue { get; set; } 

    [Display(Name = "License Plate")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string LicensePlate { get; set; } 

    [Display(Name = "Owner")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string Owner { get; set; } 

    [Display(Name = "Previous Owner")] 
    [MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")] 
    public string PreviousOwner { get; set; } 

    [Display(Name = "Date Acquired")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")] 
    public DateTime? DateAcquired { get; set; } 

    [Display(Name = "Notes")] 
    [DataType(DataType.MultilineText)] 
    public string Notes { get; set; } 

    [Required(ErrorMessage="Vehicle Type is required.")] 
    public Guid VehicleTypeID { get; set; } 
    public Guid? TransmissionTypeID { get; set; } 

    //A vehicle can only have one VehicleType and one TransmissionType 
    [Display(Name = "Vehicle Type")] 
    public virtual VehicleType VehicleType { get; set; } 

    [Display(Name = "Transmission Type")] 
    public virtual TransmissionType TransmissionType { get; set; } 


    //A vehicle can have many Parts 
    [Display(Name = "Parts")] 
    public virtual ICollection<Part> Parts { get; set; } 

    //A vehicle can have many Warranties 
    [Display(Name = "Warranties")] 
    public virtual ICollection<Warranty> Warranties {get; set; } 
} 

}

ここでは、パートモデルです:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 
using System.Globalization; 

namespace ShopLog.Models 
{ 
    public class Part 
    { 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid PartID { get; set; } 

    public string Name { get; set; } 
    public decimal Cost { get; set; } 

    [DataType(DataType.MultilineText)] 
    public string Notes { get; set; } 

    //A Part can belong to many Vehicles 
    public virtual ICollection<Vehicle> Vehicles { get; set; } 
    } 
} 
+0

各ボタンに名前を付けてみてください。それは役に立ちますか?そうすれば、ボタンは別個のポストパラメーターでなければなりません – TGH

+0

名前= "btn1"と名前= "btn2"など – TGH

+0

投稿したコードを含むこのページでは、モデルをVehicleクラスにします。あれは正しいですか?そして、2つのフォームはそれぞれ既存のパーツタイプを車両に追加するか、まったく新しいパーツ定義を作成する必要がありますか? – McGarnagle

答えて

1

私は単純なプロジェクトで

@model MvcApplication2.Models.LogOnModel 

@{ 
    ViewBag.Title = "Home Page"; 
} 

@using (Html.BeginForm("About", "Home", FormMethod.Post, null)) 
{ 
    <input type="submit" name="btn2" value="About" /> 
    @Html.TextAreaFor(m => m.UserName) 
} 

@using (Html.BeginForm("Index", "Home", FormMethod.Post, null)) 
{   
    <input type="submit" name="btn1" value="Index" /> 
    @Html.TextAreaFor(m => m.UserName) 
} 
これを試してみました

私はこれが箱の中でうまくいくと言うことができます。私はあなたのルートをチェックします...

+1

さて、私が持っているものを見てみましょう... – user1304444

+0

あなたはコードが私とはいくつかの点で異なっていると思います。私は両方のボタンがPOSTのコードにヒットする必要があります – user1304444

+0

私はデータが保存された後に起動するRedirectToAction()が必要です。 – user1304444

1

ここで私は少なくとも2番目の部分をやっています。私が最初に考え出すなら、私は戻ってきて更新します。

@using (Html.BeginForm("CreateNewVehiclePart", "Vehicle", FormMethod.Post, null)) 
{ 
    @Html.Partial("AddPart", new ShopLog.Models.Part()) 
    <input type="submit" value="Create New Vehicle Part" /> 
} 

部分図「AddPart」はこのようになります:あなたの投稿ボタンの上の「CreateNewVehiclePart」、部分的なビューをレンダリング内部のコントローラに続いて

@model ShopLog.Models.Part 
@Html.EditorForModel() 

、「CreateNewVehiclePart」だろうその部分をデータベースに追加し、元のビューにリダイレクトし直してください。

EDIT: ここでは、最初の部分についても、部分的な見解についても説明します。セットアップ車両IDを持つ隠しフィールド、およびパーツのドロップダウンリストを使用してフォーム:

@using (Html.BeginForm("AddPartsToVehicle", "Vehicle", FormMethod.Post, null)) 
(
    @Html.HiddenFor(model=>model.VehicleID) 
    @Html.Partial("SelectPart", PartsList) 
    <input type="submit" value="Add Parts To Vehicle" /> 
} 

(「PartsListは」あなたがであなたのコードブロックに設定する必要があります何かがあることに注意してくださいtop - すべての利用可能な部分のリスト。)次に、部分ビュー「SelectPartは、」このようなものだ:

@model IEnumerable<ShopLog.Models.Part> 
@Html.DropDownList("part_id", Model.Select(m=>new SelectListItem() { Text = m.Name, Value = m.PartID.ToString() })) 

その後、再び、以前のように、あなたの「AddPartsToVehicleは、」ただ、これら2つのパラメータを扱うだろう、と車両にIDのpart_idでパーツを追加します。

もちろん、私は、このページ上の2件の回答の組み合わせを使用して終了...

+0

私はこれを試してみます – user1304444

+0

これまで部分的な見解で作業したことはありませんでしたので、いくつかの助けが必要です。 Vehicle/Editビューが読み込まれます。私は行にブレークポイントを持っています:@ Html.Partial( "SelectPart"、Model.Parts);ラインがヒットし、 "Model.Parts"に2つの部品があります。しかし、私は決してパーシャルビュー "SelectPart"を見ません。 (ドロップダウンリストは表示されません)。あなたが書いたのと同じように部分的なビューをコーディングしました。 – user1304444

+0

私は問題を見ると思います。ビューに "Model.Parts"を渡していますが、これはおそらく空ではありませんか?いずれにせよ、それはドロップダウンリストのパーツの完全なリストでなければなりません。私が念頭に置いていたのは、ビューの始めにコードブロックにオブジェクトを作成することでした。@ IEnumerable PartsList =(データベースからすべての部分を取得し、静的メソッド、キャッシュ、どこに置いても)} – McGarnagle

0

を私はここで埋めるためにいくつかのギャップを残しているが、私は、これはまともなアプローチだと思います。究極の問題は、ページの上部にあるSave()ボタンが、@ "Html.BeginForm {}"を使用してラップされていないことでした。 「TGH」は私のPOSTコードが実際にどこに行っていたかをマップするのに役立ちました。それが私に究極の問題を解決させました。

部分形式を使用すると、アプリケーションをより簡潔にすることができました(ページリダイレクトが少なくなりました)。 "dbaseman"はこれらの設定を正しく行うのを助けました。

ありがとうございました!

関連する問題