1

ビューからコントローラーに値を渡す際に問題があります

これが私の見解です:

 @model  IEnumerable<SQLOperation.Models.QuestionClass.Tabelfields>

@{
     ViewBag.Title = "Question";
 }

 <h3> Question</h3>

 @{int i = 0;}

 @foreach (var item  in Model)
 {

  using (Html.BeginForm("Question", "Home"))
  {
      @Html.DisplayFor(modelItem => item.QuestionName)
      @Html.HiddenFor(m => item.QuestionID)      
         <br /><br />   
      if (item.Option1 != "")
      {
        @Html.RadioButtonFor(m => item.SelectedOption, item.Option1, item)                
        @Html.DisplayFor(modelItem => item.Option1)
                    <br /><br />                
      }

      if (item.Option2 != "")
      {
         @Html.RadioButtonFor(m => item.SelectedOption, item.Option2, item)              
         @Html.DisplayFor(modelItem => item.Option2)
                    <br /><br />
      }

      if (item.Option3 != "")
      {           
        @Html.RadioButtonFor(m => item.SelectedOption, item.Option3, item)              
        @Html.DisplayFor(modelItem => item.Option3)
                    <br /><br />
      }


      if (item.Option4 != "")
      {
       @Html.RadioButtonFor(m => item.SelectedOption, item.Option4, item)             
                    @Html.DisplayFor(modelItem => item.Option4) 
                <br /><br />     
      }
      i = (Int16)i + 1;


      if (Model.Count() == i)
      {
                <input name="btnsumbit" type="submit" value="Submit Feedback" 
                style="font-family:Segoe UI Light;font-size:medium;"/>
      }
  }
 }

私のコントローラー

[HttpGet]
    public ActionResult Question(string email)
    {
        var tf = new QuestionClass.Tabelfields();

        IList<QuestionClass.Tabelfields> viewmodel = new List<QuestionClass.Tabelfields>();
        var q = QuestionClass.getallQuestion(email).ToList();

        foreach (SQLOperation.Models.Question item in q)
        {
            QuestionClass.Tabelfields viewItem = new QuestionClass.Tabelfields();

            viewItem.Email = item.Email;
            viewItem.QuestionID = item.QuestionID;
            viewItem.QuestionName = item.QuestionName;
            viewItem.Option1 = item.Option1;
            viewItem.Option2 = item.Option2;
            viewItem.Option3 = item.Option3;
            viewItem.Option4 = item.Option4;                
            viewmodel.Add(viewItem);
        }
         return View(viewmodel);
    }

    [HttpPost, ActionName("Question")]
    public void Question(IEnumerable<QuestionClass.Tabelfields> items)
    {

    }

私のモデル:

public class QuestionClass
{
    public static FeedbackDatabaseDataContext context = new FeedbackDatabaseDataContext();

    public class Tabelfields : Question
    {
        //public decimal QuestionID { get; set; }
        //public string Email { get; set; }
        //public string QuestionName { get; set; }
        //public string Option1 { get; set; }
        //public string Option2 { get; set; }
        //public string Option3 { get; set; }
        //public string Option4 { get; set; }
        public string SelectedOption { get; set; }
    }


    public static List<Question> getallQuestion(string email)
    {
        var list = (from q in context.Questions where q.Email == @email select q);

        return list.ToList();
    }
 }

ただし、コントローラーの「アイテム」でNULLを取得します。

[HttpPost, ActionName("Question")] 
    public void Question(IEnumerable<QuestionClass.Tabelfields> items) 
    { 
    }

ビューとコントローラーを以下に変更すると、コントローラーのデータベースから最後の値を取得します

意見:

@foreach (var item in Model)
{
  using (Html.BeginForm("Question", "home", new { email=item.Email,  q=item.QuestionID}))
  {
      @Html.DisplayFor(modelItem => item.QuestionName)
      @Html.HiddenFor(m => item.QuestionID)
       .

       .

       .
       . 
  }
}

コントローラ:

[HttpPost, ActionName("Question")] 
    public void Question(string email,int q) 
    {   
    }

メールとqで値を取得します

では、すべての値、つまり QuestionId、Email、Questionname と、コントローラーで適切に選択された値 (ラジオボタン) を取得するにはどうすればよいですか?

つまり、次のコントローラーで:

[HttpPost, ActionName("Question")] 
    public void Question(IEnumerable<QuestionClass.Tabelfields> items) 
    { 
    }
4

1 に答える 1

2

Html にインデックスを付ける必要があります。*そのようなアイテムの場合。

@Html.RadioButtonFor(m => m[i].SelectedOption, item.Option3, item)

foreach物事をより簡単にするために、おそらく& と別iの宣言を取り除き、次を使用します;

@for(int i=0; i < Model.Count; i++)
{
    @Html.HiddenFor(m => m[i].QuestionID) 
    @Html.RadioButtonFor(m => m[i].SelectedOption, Model[i].Option3, Model[i])
}

このようにインデックスを作成すると、html がインデックス作成をそのままにしてレンダリングされます。

<input type='hidden' name=[0].'QuestionId' />
<input type='hidden' name=[1].'QuestionId' />
<input type='hidden' name=[2].'QuestionId' />

現在行っていることではなく、そのようにレンダリングされます。

<input type='hidden' name='QuestionId' />
<input type='hidden' name='QuestionId' />
<input type='hidden' name='QuestionId' />

インデックスを作成しないと、各フォーム フィールドに同じ名前が付けられるため、コントローラーは 1 つだけが返されたと考えます。

于 2012-08-22T07:11:57.790 に答える