2017-12-27 15 views
0

私はマスターと詳細(画像、ASO)が1ページに表示されるページを構築しました。ただし、2番目のフォームのsubmittボタンをクリックすると、1番目のフォームの検証が失敗した場合、フォームは送信されません。値を修正すると、HttpPostedFileBase uploadFileはnullになります。MVCページの2番目のフォームの入力を取得

ページには、次のようになります。

@model app1.Models.MasterModel 

@{ 
    ViewBag.Title = "Edit"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

@using (Html.BeginForm(new { @class = "form-inline col-lg-12" })) 
{ 
    @Html.AntiForgeryToken() 

    <div> 
     <h4>MasterModel</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @Html.HiddenFor(model => model.Id) 


     <div class="row"> 
      @*Master properties*@ 

      <div class="col-md-4 col-lg-4"> 
       <div class="form-horizontal"> 
        <div class="form-group"> 
         @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-3" }) 
         <div class="col-md-8"> 
          @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } }) 
          @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" }) 
         </div> 
        </div> 

       @* aso... *@ 

       </div> 
      </div> 


} 


      @* Master Details *@ 

      <div class="col-md-4 col-lg-4"> 



       @using (Html.BeginForm("NewPic", "Master", FormMethod.Post, new { enctype = "multipart/form-data" })) 
       { 
        <input name="uploadFile" type="file" /> 
        <input type="submit" value="Upload File" /> <!-- First Button, does not work --> 

        <div class="container-fluid"> 
         @foreach (app1.Models.PicModel b in Model.Pics) 
         { 

          var base64 = Convert.ToBase64String(b.DbPic); 
          var imgSrc = String.Format("data:image/gif;base64,{0}", base64); 


       <img src="@imgSrc" width="200" height="200" /> 
         } 
        </div> 


        @Html.ActionLink("Upload", "NewPic", new { id = Model.Id }) <!-- Second Button, does not work either --> 
        <label class="control-label col-md-4 col-lg-4" for="Title">Picer</label> 
       } 
      </div> 

     </div> 

     <div> 
      <div class="form-group"> 
       <div class="col-md-offset-2 col-md-12 col-lg-12"> 
        <input type="submit" value="Save" class="btn btn-default" /> 
       </div> 
      </div> 
     </div> 
    </div> 


} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 




@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

コントローラは次のようになります。

public ActionResult NewPic(int id, HttpPostedFileBase uploadFile) 
    { 
     // uploadFile is null 
    } 
+0

をご覧ください。どのボタンをクリックしていますか? –

+1

これを2つの部分的なビューに分割すると、問題を解決するのに役立ち、コードをより明確にするのに役立ちます。 –

+1

ajaxフォームを使用しようとすると、これは2番目のフォーム –

答えて

1

あなたはNewPicメソッドの前[HttpPost]を置くことを忘れてしまいました。だからNewPicメソッドは[HttpGet]と見なされるため、うまくいきません。

[HttpPost] 
public ActionResult NewPic(int id, HttpPostedFileBase uploadFile) 
{ 
    // uploadFile is null 
} 

また、以下のように両方の形式に適切なIDを指定すると、クライアント側の検証中にこの両方で作業するのが簡単になります。詳細については

フォーム1

@using (Html.BeginForm(new {id = "Form1", @class = "form-inline col-lg-12" })) 

フォーム2

@using (Html.BeginForm("NewPic", "Master", FormMethod.Post, new { id = "Form2", enctype = "multipart/form-data" })) 

あなたは、ネストされた形を持っているhere

関連する問題