MVC4从枚举创建视图

时间:2013-03-22 00:49:30

标签: c# asp.net-mvc-4

我有一个想要创建/保存的视图,而不是模型使用枚举如下。

public enum RulesEnum
{
    StopAtLight = 1,
    StopAtStreet,
    StopAtCrossWalk,
    WaitAtCrossWalk,
}

模特

public class RulesModel
{
    public RulesEnum Rules { get; set; }
    public string Comment { get; set; } 
    // some other props that you have
}

视图

    @model RulesModel
    @using (Html.BeginForm()) {
        <input type="radio" name="Rules" value="0" id="Rules1_No" />
        <input type="radio" name="Rules" value="1" id="Rules1_Yes" />
        <label for="Rules1">Stop at Light</label>
        <input type="radio" name="Rules" value="0" id="Rules2_No" />
        <input type="radio" name="Rules" value="1" id="Rules2_Yes" />
        <label for="Rules2">Stop at Street</label>
        <input type="radio" name="Rules" value="0" id="Rules3_No" />
        <input type="radio" name="Rules" value="1" id="Rules3_Yes" />
        <label for="Rules3">Stop at CrossWalk</label>
        <input type="text" name="Rules" id="Rules4" />
        <label for="Rules4">Wait at CrossWalk</label>
        <input type="submit" value="Submit" />
    }

控制器动作

[HttpPost]
public ActionResult TheMethodThatAcceptsTheInput(RulesModel model)
{
    // do as you wish here, I assume you already know what to do here
    // at this point, if the user selects a radio button 
    // then the model.Rules will show it, as an enum value of course
    return View(model);
}

这个前面的代码段只是演示了每个枚举值都有与之关联的不同控件。所以基本上我想为每个枚举值定义不同的控件。

我想创建一个KeyValuePairs列表,这样我就可以将用户为每个枚举值选择的值发送回控制器。但是,由于我的知识有限,我只知道如何将定义良好的模型发送回控制器。当用户按下提交按钮时,如何建立我的KeyValuePairs列表并将它们发送回控制器?

我已经研究了各种替代方案,例如AutoMapper和ViewModels,但我不认为我的具体问题与这些解决方案有关。我是相当新的,有人可以提供一些解决这个问题的最佳方法的指导吗?

谢谢!

更新: 看看Von的例子,我已经修改了一下。唯一的区别是我不想要枚举列表(意思是4个枚举值= 4个单选按钮),但我希望每个枚举值都是一个问题,例如:

  

停在光明之下?是/否(2个单选按钮)   在街上停下来?是/否(2个单选按钮)   在人行横道停下来?是/否(2个单选按钮)   人行横道? 30秒(文本框)

我不知道该怎么做才是用户点击提交。我需要以某种方式查看每个问题并构建列表以发送给控制器,使其看起来如下所示:

[(StopAtLight, "false"),
 (StopAtStree, "true"),
 (StopAtCrossWalk, "false"),
 (WaitAtCrossWalk, "40")]

当用户按下提交时,我不确定如何构建此列表,因为它期望一个类似于Von发布的模型。

希望这些进一步的信息有助于了解我的情况。谢谢大家的帮助。

1 个答案:

答案 0 :(得分:0)

我不确定你想要用KeyValuePairs做什么,但根据你问题中的标记,你想要在页面上显示枚举作为选项,然后有一些文本框用于输入,他们将它们提交给你的控制器。如果是这种情况,那么您可以执行以下操作:

模特

public class RulesModel
{
    public bool StopAtLight { get; set; }
    public bool StopAtStreet { get; set; }
    public bool StopAtCrossWalk { get; set; }
    public string WaitAtCrossWalk { get; set; }
    // some other props that you have
}

视图

@model RulesModel
@using (Html.BeginForm()) {
    <h1>Stop at Light</h1>
    <input type="radio" name="StopAtLight" value="false" id="Rules1_No" />
    <label for="Rules1_No">No</label>
    <input type="radio" name="StopAtLight" value="true" id="Rules1_Yes" />
    <label for="Rules1_Yes">Yes</label>
    <h1>Stop at Street</h1>
    <input type="radio" name="StopAtStreet" value="false" id="Rules2_No" />
    <label for="Rules2_No">No</label>
    <input type="radio" name="StopAtStreet" value="true" id="Rules2_Yes" />
    <label for="Rules2_Yes">Yes</label>            
    <h1>Stop at CrossWalk</h1>
    <input type="radio" name="StopAtCrossWalk" value="false" id="Rules3_No" />
    <label for="Rules3_No">No</label>
    <input type="radio" name="StopAtCrossWalk" value="true" id="Rules3_Yes" />
    <label for="Rules3_Yes">Yes</label>            
    <h1>Wait at CrossWalk</h1>
    <input type="text" name="WaitAtCrossWalk" id="WaitAtCrossWalk" />
    <input type="submit" value="Submit" />
}

控制器动作

[HttpPost]
public ActionResult TheMethodThatAcceptsTheInput(RulesModel model)
{
    // if model.StopAtLight == false then the user selected No otherwise it was Yes
    // same goes for the rest of the radio buttons
    return View(model);
}