2012-08-22 55 views
1

我從視圖中傳遞值的問題到控制器查看到控制器在MVC3

這裏是我的觀點

@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(); 
    } 
} 

但是我在控制器中的「items」中獲得NULL。

@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) 
    { 
    } 

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

如果我&控制器改變我查看下面然而,我在控制器

查看獲得最後的值從數據庫

我在電子郵件中獲得值和q

因此,如何獲得所有值,即QuestionId,Email,Questionname以及它在控制器中的適當選定值(radiobutton)?

即在繼控制器:

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

回答

2

你需要索引的HTML *對於項目本身;

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

爲了使事情simplier,我可能會擺脫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' /> 

沒有索引,每個表單字段被賦予相同的名稱,所以你控制器會只有一個返回去思考。

+0

我在Model [i] .SelectedOption上得到錯誤 –

+0

@Ajay try m [i] .SelectedOption –

+0

另外,看看這個:http://haacked.com/archive/2008/10/23/model- binding-to-a-list.aspx –