2013-03-04 244 views
0

这些都是我的POCO类:如何投票投票系统?

public class PollOptions 
    { 
     public int Id { get; set; } 
     public virtual Polls Polls { get; set; } 
     public string Answer { get; set; } 
     public int Votes { get; set; } 
    } 
public class Polls 
    { 
     public int Id { get; set; } 
     public string Question { get; set; } 
     public bool Active { get; set; } 
     public virtual ICollection<PollOptions> PollOptions { get; set; } 
    } 

而且我通过我的模型这种方式来索引视图:

public ActionResult Index() 
     { 
      var poll = db.Polls.Include("PollOptions").Where(x => x.Active).ToList(); 
      return View(model); 
     } 

,并在索引视图我想用户投票及以下 是我的部分对于投票:

@section Polling{ 
    @foreach (var question in Model.Polls) 
    { 
     <h3>@question.Question</h3> 
     <ul class="pollUnordedList"> 
     @foreach(var answer in question.PollOptions) 
     { 
      <li><input type="radio" name="opt" id="@answer.Id" value="1"/><span>@answer.Answer</span></li> 
     } 
     </ul> 
    } 
    @using (Html.BeginForm(actionName: "Radio", controllerName: "Home",routeValues: new { id = 2, value = 5 })) 
    { 
     <p><input type="submit" class="btn btn-primary" value="ارسال نظر" /></p> 
    } 
} 

我的动作方法:

public void Radio(int Id=0,int value=0) 
     { 
      PollOptions opt = db.PollOptions.Find(Id); 
      db.Entry(opt).State = System.Data.EntityState.Modified; 
      opt.Votes += value; 
      db.SaveChanges(); 
     } 

如何,我可以得到单选按钮的值和id为通作为路由值,例如在上述路线值Id和值是2,5

+0

关于'value =“1”',这个值总是等于1吗? – 2013-03-04 19:06:00

+0

@DanielLiuzzi是的。 – 2013-03-04 19:09:57

回答

1

我解决了使用jQuery AJAX我的问题:

@using (Html.BeginForm(actionName: "Radio", controllerName: "Home")) { 
     foreach (var question in Model.Polls) 
     { 
      <h3>@question.Question</h3> 
      <ul class="pollUnordedList"> 
       @foreach (var answer in question.PollOptions) 
       { 
        <li> 
         @*@Html.RadioButton("options",false,new {[email protected]})<span>@answer.Answer</span>*@ 
         @Html.RadioButton("options",answer.Id)<span>@answer.Answer</span> 
        </li> 
       } 
      </ul> 
     } 
     <p> 
      <input type="submit" id="btnVote" class="btn btn-primary" value="ارسال نظر" /> 
     </p> 
    } 

和我的操作方法:

[HttpPost] 
     public ActionResult Radio(int options) 
     { 
      var option = db.PollOptions.Find(options); 
      if (option != null) option.Votes++; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

感谢丹尼尔·里尤兹,有nt需要foreach,因为如果单选按钮被选中,表单发布时提交的单选按钮的值。

+0

除非你的视图只有一个单选按钮,否则你肯定需要'foreach'循环。当你的表单发布时,*所有单选按钮*都会发布,并且这将转换为您的操作方法上的数组,如我的答案的第二个评论中所述。 – 2013-03-05 14:02:48

0

使用您的所有单选按钮的同一个名字:

@using (Html.BeginForm(actionName: "Radio", controllerName: "Home")) { 
    foreach (var question in Model.Polls) { 
     <h3>@question.Question</h3> 
     foreach (var answer in question.PollOptions) { 
      <label> 
       <input type="radio" name="answers" value="@answer.Id" /> 
       @answer.Answer 
      </label> 
     } 
    } 

    <p><input type="submit" class="btn btn-primary" value="ارسال نظر" /></p> 
} 

然后在你的操作方法,您会收到选择答案为数组:

[HttpPost] 
public ActionResult Radio(int[] answers) 
{ 
    // TODO: Save your answers 
} 

编辑

根据您对有关值总是等于1的评论,那么传递它就没有意义了。您只需假设每个选定的单选按钮的值为1。动作方法则看起来是这样的:

[HttpPost] 
public ActionResult Radio(int[] answers) 
{ 
    foreach (var id in answers) 
    { 
     var option = db.PollOptions.Find(id); 
     if (option != null) option.Votes++; 
     db.SaveChanges(); 
    } 
} 
+0

你能进一步解释一下吗? – 2013-03-04 17:56:42

+0

当您发布多个具有相同名称的单选按钮时,它们会发布为例如'answers = 1&answers = 2&answers = 9&answers = 17&...'(对于您选择的每个无线电单元都会重复该名称)。MVC Model绑定然后将其转换为一个数组,例如'answers = {1,2,9,17,...}。然后,您可以在此数组上执行一个“foreach”循环,以将选定的答案保存到数据库中。 – 2013-03-04 18:00:46

+0

我已经更新了代码示例。 – 2013-03-04 18:05:28