2017-05-23 23 views
0

View To Controllerアクションからintデータを送信するだけです。コントローラのアクションがそのintデータを受け取っていない/そのintデータをマップできません。ビューからコントローラへデータを送信できません。.NET MVC

私のコントローラ=>

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult ConfirmNewBatchRequest(int? id) 
    { 
     if ((id?? 0) == 0) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     Studentassignbatche ConfirmStudentassignbatche = db.Studentassignbatches.Find(id); 
     Batche FindBatche = db.Batches.Find(ConfirmStudentassignbatche.batch_code); 

     if (ConfirmStudentassignbatche == null) 
     { 
      return HttpNotFound(); 
     } 

     ConfirmStudentassignbatche.StatusCode = 1; 
     db.Financeofstudents.Add(new Financeofstudent() 
     { 
      UserId = ConfirmStudentassignbatche.UserId, 
      batch_code = ConfirmStudentassignbatche.batch_code, 
      debit = FindBatche.amount, 
      credit = 0, 
      balance = FindBatche.amount, 
      lastTrunsaction = DateTime.Now, 
      entry_date = DateTime.Now 
     }); 
     TryUpdateModel(ConfirmStudentassignbatche, new string[] { "StatusCode" }); 
     db.SaveChanges(); 

     TempData["BatchConfirmSuccess"] = "Success"; 
     return RedirectToAction("Index"); 
    } 

と私の見解=>

@using Something 
    @model IEnumerable<Studentassignbatche> 

    @{ 
     ViewBag.Title = "Confirm New Batch Request From Student"; 
     IEnumerable<Course> CoursesTable = TempData["Courses"] as IEnumerable<Course>; 
     IEnumerable<UserDetail> UserDetailTable = TempData["UserDetails"] as IEnumerable<UserDetail>; 
    } 

    @section PageDescription{ 
     <section class="content-header"> 
      <h1> 
       @ViewBag.Title 
       <small>Tsms-admin</small> 
      </h1> 
     </section> 
    } 

    &nbsp; 

    <div class="table-responsive"> 
     <table class="table table-striped table-inverse table-bordered"> 
      <tr> 
       <th>#</th> 
       <th> 
        @Html.DisplayNameFor(model => model.UserId) 
       </th> 
       <th> 
        @Html.Label("Student Name") 
       </th> 
       <th> 
        @Html.DisplayNameFor(model => model.batch_code) 
       </th> 
       <th> 
        @Html.DisplayNameFor(model => model.name) 
       </th> 
       <th> 
        @Html.Label("Vendor Name") 
       </th> 
       <th> 
        @Html.DisplayNameFor(model => model.adding_date) 
       </th> 
       <th></th> 
      </tr> 
      @{ 
       int counter = 1; 
      } 
      @foreach (var item in Model) 
      { 
       <tr> 
        <td> 
         @counter 
        </td> 
        <td> 
         @Html.DisplayFor(modelItem => item.UserId) 
        </td> 
        <td> 
         @{ 
          var UserDetailsId = UserDetailTable.Where(x => x.UserId == item.UserId).Select(x => x.id).FirstOrDefault(); 
          var name = UserDetailTable.Where(x => x.UserId == item.UserId).Select(x => x.fullname).FirstOrDefault(); 
         } 
         @Html.ActionLink(name, "Details", "Students", new { id = UserDetailsId }, null) 
        </td> 
        <td> 
         @Html.ActionLink(item.batch_code, "Details", "Batche", new { id = item.batch_code }, null) 
        </td> 
        <td> 
         @Html.ActionLink(item.name, "Details", "Course", new { id = item.name }, null) 
        </td> 
        <td> 
         @{ 
          var vendorname = CoursesTable.Where(x => x.name == item.name).Select(x => x.vendor_heading).FirstOrDefault(); 
         } 
         <label style="font-weight:normal !important">@vendorname</label> 
        </td> 
        <td> 
         @Html.DisplayFor(modelItem => item.adding_date) 
        </td> 
        <td style="width:100px;"> 
         @using (Html.BeginForm()) 
         { 
          @Html.AntiForgeryToken() 
          @Html.HiddenFor(modelitem => item.id) 

          <div class="form-actions no-color"> 
           <input type="submit" value="Confirm" class="btn btn-success" /> 
          </div> 
         } 
        </td> 
       </tr> 
       counter++; 
      } 
     </table> 
    </div> 

ループ内でレンダリングされたフォームは、次のようになります。

<form action="/Admin/ConfirmNewBatchRequest" method="post"> 
    <input name="__RequestVerificationToken" type="hidden" value="K4GmhPUCkcqqclPtxW7F1YpiT_6mQBBZu7Wi8JtfQDMWdmCPMQsbj‌​Bfmtr9t8pSBrOV6Yixhh‌​tz0B-OfMtxj4Y8dOwrdR‌​BXlz9v0sD7O8YE1" /> 
    <input data-val="true" data-val-number="The field id must be a number." data-val-required="The id field is required." id="item_id" name="item.id" type="hidden" value="3" /> 
    <div class="form-actions no-color"> 
    <input type="submit" value="Confirm" class="btn btn-success" /> 
    </div> 
</form> 

、ここでどのように私のモデルであり、ビューとバインドする=>

public class Studentassignbatche 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int id { get; set; } 
    /// <summary> 
    /// //////// 
    /// </summary> 
    [Required(AllowEmptyStrings = false, ErrorMessage = "User Id Is Required!")] 
    [MaxLength(12, ErrorMessage = "The Max length Of User ID is 12 Cahracter!")] 
    [RegularExpression("[1-3]{2}-[0-9]{5}-[123]{1}|[1-3]{2}-[0-9]{7}-[123]{1}", ErrorMessage = "Invalid Id,It should [xx]-[xxxxx]-[x] or [xx]-[xxxxxxx]-[x]!")] 
    [Display(Name = "User ID")] 
    public string UserId { get; set; } 
    /// <summary> 
    /// ///////// 
    /// </summary> 
    [Required(AllowEmptyStrings = false, ErrorMessage = "Course Name Is Required!")] 
    [MaxLength(700, ErrorMessage = "The Max Length For Course Name Is 700 Character!")] 
    [Display(Name = "Course Name")] 
    public string name { get; set; } 
    /// <summary> 
    /// ///////// 
    /// </summary> 
    [Required(AllowEmptyStrings = false, ErrorMessage = "Batch Code Is Required!")] 
    [MaxLength(700, ErrorMessage = "The Max Length For Batch Code Is 700 Character!")] 
    [Display(Name = "Batch Code")] 
    public string batch_code { get; set; } 
    /// <summary> 
    /// /////// 
    /// </summary> 
    [Required(AllowEmptyStrings = false, ErrorMessage = "Status Is Required!")] 
    [RegularExpression("^(?:complete|Complete|in progress|In progress)$", ErrorMessage = "Invalid Status!")] 
    [Display(Name = "Current Status")] 
    public string status { get; set; } 
    /// <summary> 
    /// //////// 
    /// </summary> 
    [Display(Name = "Course Completion Date")] 
    [DataType(DataType.DateTime,ErrorMessage="Invalid Date!")] 
    public Nullable<DateTime> completion_date { get; set; } 

    [Display(Name="Date Of Addition")] 
    [DataType(DataType.DateTime,ErrorMessage="Invalid Date!")] 
    public DateTime adding_date { get; set; } 
    /// <summary> 
    /// ///////// 
    /// </summary> 
    [RegularExpression("^[01]{1}$", ErrorMessage = "Invalid Status Code!")] 
    [Required(ErrorMessage="Status Code Is Required!")] 
    public int StatusCode { get; set; } 

    //relationship with anothere table------ 

    [ForeignKey("UserId")] 
    public User User { get; set; } 
    /// <summary> 
    /// ////// 
    /// </summary> 
    [ForeignKey("name")] 
    public Course Course { get; set; } 
    /// <summary> 
    /// /////// 
    /// </summary> 
    [ForeignKey("batch_code")] 
    public Batche Batche { get; set; } 
} 

とコントローラ上の私は=> enter image description here ことが分かったと、私は=>

public ActionResult ConfirmNewBatchRequest(Studentassignbatche Studentassignbatche) 
    { 
     if (Studentassignbatche == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
    } 

を使用しますがデビュー、それはまだ私にnullオブジェクトを示している試すデバッグします。

これは、ビュー側で複数の<form></form>を生成することができるため、なぜこのようなことが起こっているのですか。しかし、私が理解できる限り、1つ以上のビューが生成されても、すべてのフォームは1つの隠れた入力フィールドを取得します。 とフォームが提出されるとき、その特定の隠しフィールドはそれに関連付けられます<form>。または、私のURLがhttp://localhost:43847/Admin/ConfirmNewBatchRequestのように見えるものは、URLに問題がありますか?次に、なぜこの問題が発生しているのか、そしてその問題を取り除く方法。

+0

レンダリングされたHTMLの外観はどうですか?作成した隠しフィールドに正しいIDが含まれていますか? – ADyson

+0

@ADyson HTML \t > ==> '<フォームアクション= "/管理/ ConfirmNewBatchRequest" メソッド= "ポスト" のように見える<入力名= "__ RequestVerificationToken" タイプ= "隠された" 値= "K4GmhPUCkcqqclPtxW7F1YpiT_6mQBBZu7Wi8JtfQDMWdmCPMQsbjBfmtr9t8pSBrOV6Yixhhtz0B-OfMtxj4Y8dOwrdRBXlz9v0sD7O8YE1"/>< input data-val = "true" data-val-number = "フィールドIDは数字でなければなりません。 data-val-required = "IDフィールドは必須です。" id = "item_id" name = "item。id "type =" hidden "value =" 3 "/> \t

\t

答えて

2

問題は、フォームとポストバック方法が一致しないことです。

フォームでは、レンダリングされた非表示フィールドのnameitem.idです。しかし、あなたのアクションメソッドは、単にidという単一のintを想定しています。フォームは、itemというオブジェクトの一部としてidがあるかのように送信します。

フィールドをレンダリングするために使用したHTMLヘルパーは、1つのフィールドだけでなく、モデル全体をポストバックする場合に設計されています。つまり、アクションメソッドはStudentassignbatcheというオブジェクトを受け入れる必要があります。 nameがが期待する名前と一致することを意味します

<input name="id" type="hidden" value="3" /> 

:このようなものをレンダリングする必要があり

@Html.Hidden("id", item.id) 

:この問題を解決するには

、あなたはのHiddenFieldヘルパーの簡単なバージョンを使用することができますあなたの行動方法。

+0

ありがとうございました.......................... –

+1

それは私のために働く............... –

+0

問題ない、喜んで助けて – ADyson

関連する問題